Funciones de conversión

# Funciones de conversión para crudo
## Metro cubico a barril (_p = precio, _q = cantidad)
conversor_m3bbl_p <- function(x) {x / 6.2898}
conversor_m3bbl_q <- function(x) {x * 6.2898}

# Funciones de conversión para gas
## Pies cúbico a metro cúbico
## 1ft³= 0.02831685m³
conversor_ft3m3_p <- function(x) {x / 0.02831685}
conversor_ft3m3_q <- function(x) {x * 0.02831685}

## Pie cúbico a Millón de BTU
# 1 ft3 =  0.001028 MM BTU
conversor_ft3MMBTU_q <- function(x) {x * 0.001028}
conversor_ft3MMBTU_p <- function(x) {x / 0.001028}

## Millón de BTU a metro cúbico
## 1 MM Btu =  27,8 m3 de gas (IAPG) ó 28.32861 m3 (Canada Energy Regulator)  
conversor_MMBTUm3gas_p <- function(x) {x / 28.32861}
  
## m3 a  MMBTU de gas
# 1 m3 = 0.0353 MM BTU  (Canada Energy Regulator)
# otra opción 1 m3 = 34.121 MM BTU  (BP)
conversor_m3MMBTU_q <- function(x){x * 0.0353}
conversor_m3MMBTU_p <- function(x){x / 0.0353}

## m3 a  MMBTU (Alternativa, revisar)
# conversor_m3MMBTU_q <- function(x){x * 1/27.8}
# conversor_m3MMBTU_p <- function(x){x / 1/27.8}

## Conversión a BEP desde distintas medidas
conversor_m3bep_q <- function(x) {x * 5883}
conversor_MMBTUbep_q <- function(x) {x * 0.17245496} # BP
conversor_MMBTUbep_p <- function(x) {x / 0.17245496}

Variables

Producción

Fuentes:

Producción de Crudo

poner en cuanto no coincide, cuanto esta por encima o por debajo, brecha, explicar en qué año se hace el empalme en los precios

La producción de petróleo crudo de largo plazo proviene del Anuario de Combustibles, de la cual contamos datos desde 1911 hasta 1992. Sus valores para el período 1980-1992 coinciden con los de EIA, por lo cual pueden usarse como fuentes alternativas. Asimismo, la evolución de SESCO es similar a la de EIA, salvo por pequeñas divergencias entre 2008 y 2013. La serie de Regalías presenta un nivel menor que las anteriores debido a las deducciones de producción que realizan las empresas para pagar un menor nivel de Regalías hacia las provincias donde realizan la producción. Por último, la serie del Ministerio de Economía coincide con Regalías en sus primeros años, luego presenta un nivel intermedio entre Regalías y SESCO y a partir de 2009 toma a SESCO como fuente. Salvo el Anuario de Combustibles, el resto de las series presentan datos hasta los últimos años. Por lo tanto, el criterio de selección para la serie de producción con la que se realizarán los cálculos es el siguiente:

  • Criterio de cómputo para producicón de crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream
Error: `path` does not exist: ‘datasets/existencias_crudo.xlsx’


Tabla 1. Producción de petróleo crudo en Argentina según distintas fuentes (barriles)

Producción de Gas Natural

Al igual que en la producción de petróleo crudo, la serie de largo plazo de producción de gas proviene del Anuario de Combustibles, de la cual contamos datos desde 1913 hasta 1992. A diferencia del crudo, sus valores para el período 1980-1992 no coinciden con los de EIA, pero está última sí coincide con los de Regalías entre 1999 y 2015. En cambio, la serie de SESCO, tiende a continuar la evolución de EIA y Regalías, pero con el nivel del Anuario de Combustibles, por lo que ambos pares de series pueden empalmar coherentemente según su nivel. Nuevamente, los valores de la base de Regalías son menores debido a las deducciones de producción para tributar menos regalías. La serie del Ministerio de Economía toma los valores de SESCO.Por lo tanto, el criterio de selección para la serie de producción de gas para los cálculos es el siguiente:

  • Criterio de cómputo de la producción de gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream


Tabla 2. Producción de gas natural en Argentina según distintas fuentes (MMBTU)

Produccion total

Joining, by = c("anio", "unidad")

Crudo procesado

Precio Mercado Interno

Fuentes:

  • Base Ministerio de Hacienda, Informes Sectoriales
  • Secretaría de Energía-Regalias
    • Por ausencia de información, el precio de regalias entre 1993 y 1998 es el precio total (es decir, es un ponderado que incluye también el precio del mercado externo). En los años posteriores, dicho precio sí corresponde al del mercado interno.
  • Kozulj y Pistonesi. Revista del Instituto de Economía Energética (IDEE) - Fundación Bariloche (1970 - 1988). Precio oficial interno de la cuenca neuquina a tasa de cambio oficial. Las fuentes utilizadas de esta revista son Secretaria de Energía, YPF, Gas del Estado, Boletin Informativo de Techint y series propias de IDEE
  • Memoria Anual y balances contables de YPF (varios años). Precio intero promedio resultante de la relación entre ventas y cantidades producidas.
  • Precios anuario. FALTA BUSCAR

ver de donde sacan el TCC cambiar precio del 92 por mecon estimado y valores restantes por estimado de idee

Precio Mercado Interno de Crudo

  • Criterio para precio_crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON


Tabla 3. Precio del mercado interno del petróleo crudo en Argentina según distintas fuentes (barriles)

Precio Mercado Interno de Gas Natural

  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías


Tabla 4. Precio del mercado interno del gas natural en Argentina según distintas fuentes (barriles)

Precios de Referencia del Mercado Mundial

Precios de exportación desde Argentina, benchmarks y Precios del mercado de EEUU (solo gas, internos y de expo/impo)

Precios de Referencia del Crudo

  • Fuentes seleccionadas para precio_me_crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade (clasificación SITC as reported)
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992 (1970 - 1985): Brent (Fuente: Inflation Data)

Falta construir una paridad de expo/impo con el flete

Precios de Referencia del Gas

  • Criterio de precio_externo_gas:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
Exportación Argentina
Referencias mundiales
Bolivia
Todos los precios

buscamos un precio

cuanto es una cantidad de btu de gas al precio de referencia (ej bolivia) y cuanto es si convierto esos btu a barriles y los valorizo con el precio del barril? cuanto queda la unidad en btu si tomo el precio de petroleo y lo covierto a btu. es decir, cuanto es el valor si la valorizo en precio del petroleo

¿cuantos usd es un btu de petroleo? si tomo un barril de petroleo y lo convierto a btu ( me va a dar cuantos usd es un btu) luego comparo los usd/btu y lo comparo con el gas de bolivia

grinber: convierte todo el gas en petroleo y le pone el precio de petroeloe. subestima los precios del gas?

Exportaciones e Importaciones

Exportaciones e Importaciones de Crudo

  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
Error in list2(...) : objeto 'comex_post2010' no encontrado

Exportaciones e Importaciones de Gas

  • Fuentes seleccionadas:
  • 1962 a 1996: UN Comtrade,
  • 1997 en adelante: SESCO Downstream
  • Datos faltantes para los años 1999 y 2000

Regalías

  • Fuentes:
    • Secretaría de Energía (Base Regalías)

REVISAR EL CALCULO DE BETANIA cuanto ganarian las provincias si el precio del mercado interno se acomoda al internacional?

Subsidios

Joining, by = "anio"
NAs introducidos por coerci昼㸳nError: `path` does not exist: ‘subsidios.xlsx’

Pozos

Metros perforados

Fuente:

Pozos en operación

Fuentes:

  • Secretaría de Energía - Datos MINEM:
    • Listado de pozos cargados por empresas operadoras: se toma la variable “Fecha del Fin de terminación de perforación del pozo” (adjiv_fecha_fin_term) como año de puesta en producción del pozo. Se podría elaborar un stock de pozos a partir de acumular los pozos terminados y restando los pozos abandonados, agrupando con la variable “Fecha de abandono del pozo”(adjiv_fecha_abandono)
    • Pozos terminados
    • Capítulo IV
    • Estado de pozos (AUN NO SE PROCESÓ ESTA BASE NI LA ANTERIOR)
    • SESCO
  • IAPG. Se presentan dos series: una elaborada a partir de los pozos perforados por año (resultante de descargar una base por cada año del sitio web oficial) y otra que corresponde al stock de pozos de petróleo de extracción efectiva (procedente de los datos de Estadísticas del Centenario de IAPG).

ver relaciones * PBI hidrocarburos / PBI total (ver cual elegir) * corregir nuestro VBP depurando servicios * MIP’s coef tecnico (para ver CI en el sector petrolero y peso del sector petrolero en PBI)

  • stock petrolero / stock total JIC,EM
  • Stock extraccion = PPyE PAE + PPyE Tecp + PPyE Petrobras upstr + Activo YPF upstream
    • ver que porcentaje que representan estas empresas en la produccion o pozos y ver de ampliarlo
    • ver relacion Activo YPF upstream / PPyE integrada YPF
    • ver relacion ganancias AFIP y BOLSAR con el stock correspondiente (coherencia)
    • ver relacion con Coremberg
    • pasar ENGE

grinberg convertir lo nuestro a costos. agarrar nuestros valor y dividirlo por barriles (sumando gas en BOE) * costos por bbl, precio el barril y precio de produccion (sumo la gcia normal al costo1)

Activos

Pasar datos de bs de uso en yacimientos para armar relación activo yacimeinto/total

Fuentes:

  • Balances de Bolsar (unicamente empresas que cotizan en la bolsa de valores argentina). Revisar el stock del sector distribución porque se presenta demasiado grande con respecto al de los demás. Falta pasar los datos del activo de casi todas las empresas

  • AFIP. Con esta fuente no tenemos calculo de renta, sino que solo usamos la TG como parámetro. Nota: "_c" significa casos presentados de la variable correspondiente

  • Memorias de YPF. La década de los 80 presenta picos que hay que revisar

  • Calculo del Capital Total Adelantado (KTA)

    • Bolsar: Es equivalente a la suma de Propiedad, Planta y Equipos Neta (descontando los terrenos y obras en curso) y los Inventarios. Cuando los datos lo habilitan, se le agregó los salarios adelantados (salarios y cargas consumidos sobre rotación). Luego, cuando no se presentaron datos de Propiedad, Planta y Equipos, se tomó el activo no corriente.
    • AFIP: Es equivalente a la suma de Bienes de Uso, Bienes de Cambio, Inventarios y Disponibilidades.
    • Memoria YPF: Suma de Bienes de Uso y Bienes de Cambio

Stock total de la rama

Stock de segmentos de YPF y Petrobras

Stock por empresas

YPF largo plazo

Comparación entre la Memoria YPF (recopilado por BFR) y los balances extríados de Bolsar

Estimación de stock de capital a partir de la evolución de pozos perforados

El ejercicio consiste en verificar si los pozos terminados sirven como indicador de la inversión y, por lo tanto, de aproximador al stock de capital adelantado. Para ello se parte de un año base de la serie de Propiedad, Planta y Equipo del sector extracción de Bolsar y AFIP, para luego indexar las variables por la evolución de los pozos. Los balances de Bolsar que corresponden únicamente a extracción son dos: PAE y Tecpetrol, por lo que el valor obtenido puede estar subrepresentado para dar cuenta del total de la rama. Con respecto al índice de pozos, se tomaron dos series alternativas: una construída a partir del stock de pozos en extracción efectiva (fuente: IAPG) y otra elaborada con los pozos terminados anuales cargados por empresa operadora (fuente: Secretaría de Energía).

El año base elegido es 2006, dado que es el último dato que poseemos del stock de pozos totales en actividad de IAPG.

Se realizó la misma estimación para YPF, filtrando las variables de Propiedad, Planta y Equipo (para el total de la empresa, por lo que incluye no sólo extracción sino refinación y otros rubros) y activo total del upstream. Se utilizó únicamente el indice de pozos terminados anuales de YPF para estimar la PPyE y el activo, dado que no se posee valores del stock de pozos en perforación para los años en donde existen valores contables que sirvan de año base. Luego, se estimó un stock de capital total de rama a partir de ponderar el stock de YPF por la relación entre los pozos de YPF y los pozos totales de la rama.

En síntesis, el listado de variables estimadas- a partir de las dos series de pozos (stock y flujo),salvo para la estimación de YPF que solo se pudo hacer con flujo de pozos por ausencia de información- es las siguientes:

  • \(ppye\_estimado\_bolsar\) = \(PPyE\ año\ base\ de\ Bolsar\) * \(indice\ de\ pozos\)

  • \(ppye\_estimado\_afip\) = \(PPyE\ año\ base\ de\ AFIP\) * \(indice\ de\ pozos\)

  • \(ppye\_estimado\_ypf\) = \(PPyE\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)

  • \(activo\_estimado\_upstream\_ypf\) = \(Activo\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)

  • \(ppye\_estimado\_total\) = \(ppye\_estimado\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]

  • \(activo\_estimado\_upstream\) = \(activo\_estimado\_upstream\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]

Para poder seleccionar la estimación más adecuada, se realizó un análisis de correlación entre todas las series estimadas y los valores contables que se poseen de PPyE de AFIP, Bolsar e YPF. Se presentan distintos cuadros de correlaciones, con sus nivles de significancia, diagramas de dispersión entre variables y su distribución. Las series construídas que poseen mejor correlación son la Propiedad, Planta y Equipo a partir de Bolsar estimadas con índice de stock de pozos (correlación fuerte de 0.89 y significativa al 0.001) y flujo de pozos (correlación moderada de 0.54 y significativa al 0.05) y luego el activo del upstream total de la rama a partir de YPF (correlación moderada de 0.42 y significativa al 0.1 con los valores contables de YPF y correlación fuerte de 0.88 y significativa al 0.001 con las estimaciones de PPyE de AFIP y Bolsar a partir de flujo de pozos).

la estimación tiene que realizarse con PPyE porque hay que excluir salarios e inventarios (que están en KTA)

Análisis de correlacion entre Propiedad, Planta y Equipo y Pozos en producción

reemplazar ipc por un ibif o indice especifico

Total rama

                  ppye_afip ppye_bolsar pozos_iapg pozos_terminados
ppye_afip         1.0000000   0.1743854 -0.2930975       -0.6054224
ppye_bolsar       0.1743854   1.0000000 -0.4269400       -0.5803358
pozos_iapg       -0.2930975  -0.4269400  1.0000000        0.8924037
pozos_terminados -0.6054224  -0.5803358  0.8924037        1.0000000
pozos_cargados   -0.3793896  -0.3213849  0.9611781        0.8696256
                 pozos_cargados
ppye_afip            -0.3793896
ppye_bolsar          -0.3213849
pozos_iapg            0.9611781
pozos_terminados      0.8696256
pozos_cargados        1.0000000

Stock de pozos

             ppye_afip ppye_bolsar pozos_iapg
ppye_afip    1.0000000   0.8382675 -0.9152596
ppye_bolsar  0.8382675   1.0000000 -0.9096424
pozos_iapg  -0.9152596  -0.9096424  1.0000000

YPF
                activo_upstream ppye_integrada      pozos
activo_upstream       1.0000000     0.22492855 0.51192183
ppye_integrada        0.2249285     1.00000000 0.06456351
pozos                 0.5119218     0.06456351 1.00000000

PPyE y activo upstream total rama a partir de YPF
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = "anio"
Joining, by = "anio"

Inversiones

Fuentes:

  1. construir serie de inversión para atras (buscar Stock de YPF pero solo para extracción). armar ejercicio de FD y ver si las proporciones se mantienen.
  • Reconstruccion de serie de inversion por empresa ver un flujo de pozos y un flujo de inversion y luego ver si lo que mueve la inversion son los pozos (que su evolucion sea similar).

  • inversion por empresa (balance: variacion del activo + consumo de K fijo)

  • inversion por empresa (secretaria de energia)

  • inversion agregada (tipo de inversion) (cuentas nacionales?)

  • pozos nuevos por empresa por año

  • pozos nuevos totales

  • aplicar MIP para YPF

Inversión a partir de Balances

Inversión a partir de Secretaria de Energía

Análisis de correlación entre Inversión y Pozos

  • buscar correlacion, para ver si la serie de inversión se mueve similar a los pozos
  • usar stock y ademas usar variacion de stock (bs de uso)

Con pozos de IAPG

Con pozos Cap IV

Valor total de la producción y ganancia

Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio

Hay dos estimaciones del Valor Bruto y Agregado de Producción, con su correspondiente Consumo Interemedio, los cuales corresponden a fuentes distintas. Asimismo, se deduce la plusalía total de la rama luego de descontar del Valor Agregado el respectivo consumo intermedio, masa salarial, impuestos específicos y depreciación de capital.

Fuentes:

  • INDEC - Dirección Nacional de Cuentas Nacionales (Base Minería e Hidrocarburos de las Cuentas Nacionales). Las variables “extraccion_y_servicios_hidrocarburos” refieren a “Extracción de petróleo crudo y gas natural. Actividades de servicios relacionadas con la extracción de petróleo y gas, excepto las actividades de prospección”

  • Cálculo propio del VBP con datos datos de producción y precio internacional recopilados. Las fuentes son las siguientes (los criterios son los mismos para la utilización posterior en el cálculo de renta de la tierra hidrocarburífera por diferencial de precios, sobrevaluación cambiaria y otros mecanismos)

Fuentes elegidas para la construcción de series

  • Producción de Crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream
  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade (clasificación SITC as reported)
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
  • Precio Mercado Interno de Crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON
  • Precio Mercado Externo Crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992: Brent (Fuente: Inflation Data)
  • Producción de Gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream
  • Exportaciones de gas:
    • 1962 a 1996: UN Comtrade,
    • 1997 en adelante: SESCO Downstream
    • Datos faltantes para los años 1999 y 2000
  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías
    • El dato del año 1992 se dividió por 10, dado que resultaba excesivamente alto, lo cual es metodológicamente inaceptable pero sirve de ejercicio.
  • Precio Mercado Externo:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971


Estimación por Cuentas Nacionales

[1] 271

Estimaciones en base a fuentes recopiladas. Metodología propia y CCNN

\[VBP_{propia} = (Pext_{petróleo} * Q_{petróleo} + Pext_{gas} * Q_{gas}) * TCP\] \[VBP_{CCNN} = (Pint_{petróleo} * QMInt_{petróleo} + Pext_{petróleo} * Expo_{petróleo} + Pint_{gas} * QMInt_{gas} + Pext_{gas} * Expo_{gas})* TCC\]

Donde:

  • \(VBP_{propia}\) = Valor Bruto de la Producción, estimación propia
  • \(VBP_{CCNN}\) = Valor Bruto de la Producción, criterio de las CCNN
  • \(Pext_{petróleo}\) = Precio de exportación/referencia internacional del petróleo crudo
  • \(Pext_{gas}\) = Precio de exportación/referencia internacional del gas natural
  • \(Pint_{petróleo}\) = Precio mercado interno del petróleo crudo
  • \(Pint_{gas}\) = Precio mercado interno del gas natural
  • \(Q_{petróleo}\) = Cantidades producidas totales de petróleo crudo
  • \(Q_{gas}\) = Cantidades producidas totales de gas natural
  • \(QMInt_{petróleo}\) = cantidades vendidas al mercado interno de petróleo crudo
  • \(QMInt_{gas}\) = cantidades vendidas al mercado interno del gas natural
  • \(Expo_{petróleo}\) = exportaciones de petróleo crudo
  • \(Expo_{gas}\) = exportaciones de gas natural
  • \(TCC\) = Tipo de Cambio Comercial
  • \(TCP\) = Tipo de Cambio de Paridad

\[ CI_{propia} = VBP_{CCNN} * Coef\_tec \]

\[VA_{propia} = VBP_{propia} – CI_{propia} \]

Donde:

  • \(CI_{propia}\) = Consumo Intermedio, estimación propia
  • \(VA_{propia}\) = Valor Agregado, estimación propia
  • \(Coef\_tec\) = Coeficiente técnico de Matriz Insumo Producto

\[MS_{propia} = W * Emp * 13\]

Donde:

  • \(MS_{propia}\) = Masa Salarial, estimación propia
  • \(W\) = Salario anual promedio
  • \(Emp\) = Empleo

\[ConKfijo = PPyE * prom(\frac{Dep}{PPyE}) \]

Donde:

  • \(ConKfijo\) = Consumo de Capital Fijo
  • \(PPyE\)= Propiedad, Planta y Equipo neta
  • $ prom() $ = tasa de depreciación promedio
  • \(Dep\) = Depreciaciones (cuenta gastos)

\[PV_{propia} = VA_{propia} – MS_{propia} – ConKfijo - IMP \]

Donde:

  • \(PV_{propia}\) = Plusvalía (Excedente Bruto de Explotación)
  • \(IMP\) = Impuestos normales

En los casos en los que se presenta dato de consumo intermedio y masa salarial de las CCNN, se realizó el reemplazo de los datos estimados por los registrados en CCNN.

Con respecto a la estimación propia, el consumo intermedio se estimó a partir de multiplicar el Valor Bruto de Producción por el coeficiente técnico resultante del Cuadro de Utilizacion de INDEC año 2004 (obtenido a partir del ratio CI/VBP). Su valor es igual 0.369, lo cual no está alejado del coeficiente promedio resultante de la serie de Valor de la Producción en base a cuentas nacionales (0.412). Sí se encuentra más alejado del coeficiente de la MIP base 1997 (0.272).

Por su parte, la masa salarial se calculó como la multiplicación entre la remuneración promedio de la rama por el empleo registrado por los 12 meses del año más el aguinaldo. Los años faltantes se completaron por medio de multiplicar el VBP por el peso promedio de la masa salarial para los años con datos. Un método similar aplica Dachevsky: resulta de multiplicar el VBP por la proporción entre la remuneración a los asalariados sobre el valor total de producción de YPF para el año 1973/1963.

El consumo de capital fijo surge de aplicar la tasa de depreciación promedio resultante de los balances de YPF (1998 - 2018) al stock de capital adelantado estimado (ver apartado Estimación de stock de capital a partir de la evolución de pozos perforados) .

Corrección VPB

Cuadro utilizacion de oferta peso de los servicios = Servicios petroleo/extraccion = 10,7% (2)

años 2004-2011 aplicamos coef a base mineria/hidrocarburos CCNN VBP extraccion( CCNN) = VBP extraccion y servicios (CCNN) * 0,893 (1)

1910 - 2018 armar indice VBP criterio CCNN para mover (1) los años que nos faltan (1910 - 2004 y 2012 -2018) deberia ser = que aplicar coef (2) a VBP

Empleo, Remuneraciones y Masa Salarial (CCNN)

Fuentes:

Plusvalía total del sector

[1] 0.0005121029
Missing column names filled in: 'X1' [1]
Joining, by = "anio"

Cálculos de Tasa de Ganancia

\[TG_{hidrocarburos} = \frac{PV_{hidrocarburífera}}{KTA_{hidrocarburífero}}\]

Renta apropiada por las empresas de la rama

La renta apropiada por las empresas de la rama se calcula por medio del diferencial de tasas de ganancia entre el sector hidrocarburífero que surge a partir de los balances y la rentabilidad normal de la economía.

\[Renta\_empresas = KTA_{hidrocarburífero} * (TG_{hidrocarburífera} - TG_{referencia})\] \[TG_{hidrocarburífera} = \frac{Gcia_{hidrocarburos}}{KTA_{hidrocarburífero}}\] Por lo cual, la renta apropiada por las empresas de la rama sería equivalente a:

\[Renta\_empresas = Gcia_{hidrocarburos} - KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburífero}\) = Stock de capital adelantado de empresas hidrocarburíferas
  • \(TG_{hidrocarburífera}\) = Tasa de ganancia de empresas hidrocarburíferas
  • \(TG_{referencia}\) = Tasa de ganancia de referencia
  • \(Gcia_{hidrocarburos}\) = Ganancia de empresas hidrocarburíferas
Joining, by = "anio"

Renta por el diferencial de precios entre el mercado interno y las referencias internacionales

Renta apropiada mediante el abaratamiento en el consumo interno por efecto del diferencial de precios interno/externo, sobrevaluación de la moneda y retenciones a la exportación

Criterio de cómputo de JK (variable ‘renta_dif_precios’)

\[RDP= ProdInt * Pext * TCP - ProdInt * PMI * TCC\]

Donde:

  • \(RDP\) = Renta apropiada por efecto diferencial de precios interno/externo y sobrevaluación
  • \(MdoInt\) = Producción destinada al Mercado Interno: Producción - Exportaciones - Existencias (barriles de petróleo ó MMBTU)
  • \(Pext\) = Precio de referencia del mercado externo (USD)
  • \(PMI\) = Precio de venta del mercado interno (USD)
  • \(TCP\) = Tipo de Cambio de Paridad
  • \(TCC\) = Tipo de Cambio Comercial

Criterio de cómputo de JIC y cia (variable ‘renta_abaratamiento_sobrevaluacion’)

\[RDP = MdoInt * PMI * (\frac{TCP}{TCC} - 1)\]

Renta apropiada por sobrevaluación cambiaria

\[Rsobrevaluacion = Expo * Pext * (TCP - TCC)\]

Donde: * \(Rsobrevaluacion\) = Renta apropiada por exportaciones con tipo de cambio sobrevaluado * \(Expo\) = Exportaciones (barriles de petróleo ó MMBTU) * \(Pext\) = Precio de referencia del mercado externo (USD) * \(TCP\) = Tipo de Cambio de Paridad * \(TCC\) = Tipo de Cambio Comercial

Joining, by = "anio"

Renta apropiada por el Estado mediante impuestos específicos

Joining, by = "anio"
Joining, by = c("anio", "unidad")
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = c("anio", "unidad")

\[Rimp = RE + Reg\]

Donde:

  • \(Rimp\) = Renta apropiada por el Estado mediante impuestos específicos
  • \(RE\) = Retenciones
  • \(Reg\) = Regalias

Renta apropiada por consumidores y refinerías y procesadoras

Criterio de cómputo de Ramón (2019)

Refinerías y procesadoras

\[RR = (PI - PRMi) * CrudoP\]

  • \(RR\) = Renta apropiada por las Refinadoras
  • \(PI\) = promedio ponderado de Precios Internacionales
  • \(PRMi\) = Precio ponderado a Refinerías del Mercado Interno
  • \(CrudoP\) = barriles de Crudo Procesado por las refinadoras

Consumidores

\[RC = (PI - PRMi - MR) * CrudoP \]

  • \(RC\) = Renta apropiada por los Consumidores
  • \(MR\) = Margen de Refinerías

Esto resulta equivalente a plantear:

\[RC = PCMi * CrudoP\]

  • \(PCMi\) = Precio ponderado a Consumidores del Mercado Interno.

Renta Hidrocarburífera Total. En precios constantes, sobre Plusvalía Total y PBI

Existen dos caminos para llegar al monto total de renta de la tierra hidrocarburífera: uno es descontando la ganancia normal de las empresas a la plusvalía total del sector y el otro es por medio de la suma de mecanismos de apropiación.

\[Renta\_hidrocarburífera = PV_{hidrocarburífera} - Gcia\_Normal_{hidrocarburífera}\] Donde:

  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia Normal del sector hidrocarburífero
  • \(PV_{hidrocarburífera}\) = Plusvalía del sector hidrocarburífero

\[Gcia\_Normal_{hidrocarburífera} = KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburos}\) = Stock de capital adelantado del sector hidrocarburífero
  • \(TG_{referencia}\) = Tasa de ganancia normal de referencia.

En este caso, seleccionamos la tasa de ganancia del sector industrial como parámetro para diferenciar la renta de la ganancia. A su vez, para el capital total adelantado de las empresas hidrocarburíferas, seleccionamos unicamente el valor resultante de la estimación de la PPyE de Bolsar a partir del indice de flujo de pozos (variable “ppye_bolsar_flujo”), por lo que le faltan los inventarios y salarios adelantados.

El cálculo de renta total hidrocarburífera que se obtiene por medio de descontar la ganancia normal a la plusvalía total del sector, debe ser igual a la renta obtenida por medio de la agregación de los distintos mecanismos de apropiación. Es decir:

\[Renta\_hidrocarburífera = Renta\_diferencial\_precios + Renta\_sobrevaluación + Renta\_empresas + Impuestos\_netos\_específicos \] \[Impuestos\_netos\_específicos = Retenciones + Regalías - Subsidios\]

Renta total a partir de descuentos sobre el VBP

Joining, by = "anio"
Joining, by = "anio"

Renta total a partir de suma de mecanismos

Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Removed 21 rows containing missing values (position_stack).'big.mark' and 'decimal.mark' are both '.', which could be confusing
'big.mark' and 'decimal.mark' are both '.', which could be confusing

Costos

Joining, by = "anio"
Joining, by = "anio"

Comparación con estimación de otros autores

'big.mark' and 'decimal.mark' are both '.', which could be confusing
[1] "Mateo, el código terminó de correr"

Pendientes

Recortes viejos que no se pq se realizaron

Recorte de estimacion de kta a partir de pozos

Calculos de otros

Buscar: - Montamat - Einstoss Tinto A. Análisis de la Evolución reciente de la Renta Petrolera en Argentina CECE

Producción

  • ver cantidades vendidas y no producidas. buscar si existe serie de existencias

Exportacion

# fijarse de lo de betania

Precios

#notas sobre la revisión de excels betania: * Diferencial de precios combustibles y crudo - ARG EEUU WTI: el precio interno en pesos parece resultante de la división entre valor y cantidad. Luego el precio interno en dolares esta en barriles pero no se sabe como se calculo ni fuente * Serie larga cursos de renta 1963-2011: el precio interno de la solapa recalculo diferencial de precios, no es ni sesco ni mecon pero da muy similar

#precio gas bolivia: fuente de bolivia. ver el tema de transporte #precio de referencia de petroleo: escalante? otro?

# Subsidios: JK usó fuente EJES

LS0tDQp0aXRsZTogIlJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYSBlbiBBcmdlbnRpbmEgKDE5NjAgLSAyMDE4KSINCmF1dGhvcjoNCi0gYWZmaWxpYXRpb246IFVOR1MvQ09OSUNFVA0KICBuYW1lOiBNYXRlbyBTdXN0ZXIgeSBKdWFuIEtvcm5ibGlodHQNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KPGJyPg0KPGJyPg0KDQo8Y2VudGVyPiA8aDE+PC9oMT4gPC9jZW50ZXI+IA0KDQoNCg0KYGBge3J9DQojIHBhcmEgZ3VhcmRhciBnZ3Bsb3QgY29uIHRhbWHDsW8NCiMgZ2dzYXZlKCJmYWNldF93cmFwX2NoYXJ0LnBuZyIsIGZhY2V0X3dyYXBfY2hhcnQsIHdpZHRoID0gMTY4MC83MiwgaGVpZ2h0ID0gMTA1MC83MiwgZHBpID0gNzIpDQoNCmBgYA0KDQogIA0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgbGlicmFyeSh4dGFibGUpICMgZWogeHRhYmxlKHRhYmxhKSBwYXJhIHBhc2FyIGEgbGF0ZXgNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpDQoNCmxpYnJhcnkocmVhZHhsKSANCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShmcykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShodXh0YWJsZSkgI3JldmlzYXIgZXN0byBwYXJhIGRhciBmb3JtYXRvIGFsIGVqZSBZDQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KbGlicmFyeShIbWlzYykNCiMgbGlicmFyeSh6b28pDQoNCg0KDQpvcHRpb25zKHNjaXBlbiA9IDk5OTk5OTkpDQoNCiMgYWdyZWdhciBsYWJlbCBwYXJhIHZhcmlhYmxlcyBkZSBncmFmaWNvcyANCiNmYWNldHdyYXAofiBleHBlcmltZW50b3gsIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIoZXhwX25hbWVzKSkrICANCg0KYGBgDQoNCiMgRnVuY2lvbmVzIGRlIGNvbnZlcnNpw7NuIA0KDQoqIFtDYW5hZGEg4oCTIE5hdGlvbmFsIEVuZXJneSBCb2FyZC4gRW5lcmd5IENvbnZlcnNpb24gVGFibGVzXShodHRwczovL2FwcHMuY2VyLXJlYy5nYy5jYS9Db252ZXJzaW9uL2NvbnZlcnNpb24tdGFibGVzLmFzcHg/R29DVGVtcGxhdGVDdWx0dXJlPWVuLUNBIzItMykNCiogW0JQXShodHRwczovL3d3dy5icC5jb20vY29udGVudC9kYW0vYnAvYnVzaW5lc3Mtc2l0ZXMvZW4vZ2xvYmFsL2NvcnBvcmF0ZS9wZGZzL2VuZXJneS1lY29ub21pY3Mvc3RhdGlzdGljYWwtcmV2aWV3L2JwLXN0YXRzLXJldmlldy0yMDE5LWFwcHJveGltYXRlLWNvbnZlcnNpb24tZmFjdG9ycy5wZGYpDQoqIFtFSUFdKGh0dHBzOi8vd3d3LmVpYS5nb3Yva2lkcy93aGF0LWlzLWVuZXJneS9lbmVyZ3ktY2FsY3VsYXRvcnMucGhwI25hdGdhc2NhbGMpDQoNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBGdW5jaW9uZXMgZGUgY29udmVyc2nDs24gcGFyYSBjcnVkbw0KIyMgTWV0cm8gY3ViaWNvIGEgYmFycmlsIChfcCA9IHByZWNpbywgX3EgPSBjYW50aWRhZCkNCmNvbnZlcnNvcl9tM2JibF9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gNi4yODk4fQ0KY29udmVyc29yX20zYmJsX3EgPC0gZnVuY3Rpb24oeCkge3ggKiA2LjI4OTh9DQoNCiMgRnVuY2lvbmVzIGRlIGNvbnZlcnNpw7NuIHBhcmEgZ2FzDQojIyBQaWVzIGPDumJpY28gYSBtZXRybyBjw7piaWNvDQojIyAxZnTCsz0gMC4wMjgzMTY4NW3Csw0KY29udmVyc29yX2Z0M20zX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAwLjAyODMxNjg1fQ0KY29udmVyc29yX2Z0M20zX3EgPC0gZnVuY3Rpb24oeCkge3ggKiAwLjAyODMxNjg1fQ0KDQojIyBQaWUgY8O6YmljbyBhIE1pbGzDs24gZGUgQlRVDQojIDEgZnQzID0gIDAuMDAxMDI4IE1NIEJUVQ0KY29udmVyc29yX2Z0M01NQlRVX3EgPC0gZnVuY3Rpb24oeCkge3ggKiAwLjAwMTAyOH0NCmNvbnZlcnNvcl9mdDNNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gMC4wMDEwMjh9DQoNCiMjIE1pbGzDs24gZGUgQlRVIGEgbWV0cm8gY8O6Ymljbw0KIyMgMSBNTSBCdHUgPSAgMjcsOCBtMyBkZSBnYXMgKElBUEcpIMOzIDI4LjMyODYxIG0zIChDYW5hZGEgRW5lcmd5IFJlZ3VsYXRvcikgIA0KY29udmVyc29yX01NQlRVbTNnYXNfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDI4LjMyODYxfQ0KICANCiMjIG0zIGEgIE1NQlRVIGRlIGdhcw0KIyAxIG0zID0gMC4wMzUzIE1NIEJUVSAgKENhbmFkYSBFbmVyZ3kgUmVndWxhdG9yKQ0KIyBvdHJhIG9wY2nDs24gMSBtMyA9IDM0LjEyMSBNTSBCVFUgIChCUCkNCmNvbnZlcnNvcl9tM01NQlRVX3EgPC0gZnVuY3Rpb24oeCl7eCAqIDAuMDM1M30NCmNvbnZlcnNvcl9tM01NQlRVX3AgPC0gZnVuY3Rpb24oeCl7eCAvIDAuMDM1M30NCg0KIyMgbTMgYSAgTU1CVFUgKEFsdGVybmF0aXZhLCByZXZpc2FyKQ0KIyBjb252ZXJzb3JfbTNNTUJUVV9xIDwtIGZ1bmN0aW9uKHgpe3ggKiAxLzI3Ljh9DQojIGNvbnZlcnNvcl9tM01NQlRVX3AgPC0gZnVuY3Rpb24oeCl7eCAvIDEvMjcuOH0NCg0KIyMgQ29udmVyc2nDs24gYSBCRVAgZGVzZGUgZGlzdGludGFzIG1lZGlkYXMNCmNvbnZlcnNvcl9tM2JlcF9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogNTg4M30NCmNvbnZlcnNvcl9NTUJUVWJlcF9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogMC4xNzI0NTQ5Nn0gIyBCUA0KY29udmVyc29yX01NQlRVYmVwX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAwLjE3MjQ1NDk2fQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgT3RyYXMgZnVuY2lvbmVzDQpjYW1iaW9fcG9yY2VudHVhbCA8LSBmdW5jdGlvbih4KSB7eC9sYWcoeCkgLSAxfQ0KDQpnZW5lcmFyX2luZGljZSA8LSAgZnVuY3Rpb24oc2VyaWUsZmVjaGEsIGZlY2hhX2Jhc2Upew0KICB2YWxvcl9iYXNlIDwtIHNlcmllW3doaWNoKGZlY2hhPT1mZWNoYV9iYXNlKV0NCiAgaWZfZWxzZShzZXJpZSA9PSAwLCAwLCBzZXJpZS92YWxvcl9iYXNlKQ0KfQ0KDQoNCg0KdmFyaWFjaW9uX2ludGVyYW51YWwgPC0gZnVuY3Rpb24oeCkge3ggIC0gbGFnKHgpfQ0KDQp0YXNhX2NyZWNpbWllbnRvIDwtIGZ1bmN0aW9uKHgpIHsoeCAgLSBsYWcoeCkpL2xhZyh4KX0NCg0KDQpnZW5lcmFyX2luZGljZSA8LSAgZnVuY3Rpb24oc2VyaWUsZmVjaGEsIGZlY2hhX2Jhc2Upew0KICB2YWxvcl9iYXNlIDwtIHNlcmllW3doaWNoKGZlY2hhPT1mZWNoYV9iYXNlKV0NCiAgKHNlcmllL3ZhbG9yX2Jhc2UpDQp9DQoNCg0KDQojIFRhYmxhIHBhcmEgY29udmVydGlyIGxvcyBjYW1iaW9zIGRlIG1vbmVkYQ0KY29udmVyc29yX3Blc29zIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvcGFzZSBkZSBtb25lZGEueGxzeCIpICU+JSANCiAgIyBtdXRhdGUoIm0kbiIgPSBhcy5kb3VibGUoY29udmVyc29yX3Blc29zJGBtJG5gKSkgJT4lIA0KICBtdXRhdGVfYWxsKC4sIGFzLmRvdWJsZSkgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gYygibW9uZWRhIG5hY2lvbmFsIiwgInBlc29zIGxleSIsICJwZXNvIGFyZ2VudGlubyIsICJhdXN0cmFsIiwgInBlc29zIikpICU+JSANCiAgZmlsdGVyKG1vbmVkYSA9PSAicGVzb3MiKQ0KDQpgYGANCg0KDQoNCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCiMgRGF0b3MgYXV4aWxpYXJlcw0KIyNSZXZpc3RhIGRlIFBvbMOtdGljYSBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnw61hDQojIyBHQVMNCiNwcmVjaW8gdHJhbnNmZXJlbmNpYSwgcmVnYWxpYXMsIGNvbXBlbnNhY2lvbmVzLCBldGMgYSBub3ZpZW1icmUgZGUgY2FkYSBhw7FvDQpjdWFkcm9fNC4xIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMSkNCg0KI3ByZWNpbyBib2xpdmlhIHZzIHByZWNpb3MgaW50ZXJub3MNCmN1YWRyb180LjMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIGdhcyBuYXR1cmFsIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg4Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSAzKSAlPiUNCiAgcmVuYW1lKHVuaWRhZF9nYXMgPSAidW5pZGFkIGdhcyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9nYXMgPSAicGVzb3MgZGUgMTk3MC8xMDAwIG0zIiApDQoNCiNwcmVjaW8gYWRxdWlzaWNpw7NuIGRlbCBFc3RhZG8geSB0YXJpZmEgbWVkaWEgZGUgZ2FzIGRpc3RyaWJ1aWRvDQpjdWFkcm9fNC40IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNCkNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBDUlVETw0KDQojIFByZWNpb3MgcG9yIGN1ZW5jYQ0KY3VhZHJvXzIuMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAwLCBzaGVldCA9IDIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJwZXNvcyBkZSAxOTcwIikNCg0KI2V2b2x1Y2nDs24gZGUgcHJlY2lvcyBwb3IgY3VlbmNpYSAoaW5kaWNlcyAxOTcwID0gMTAwKQ0KY3VhZHJvXzIuMyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAwLCBzaGVldCA9IDMpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiLi4uMSIpDQoNCg0KIyBwcmVjaW8gcHJvbWVkaW8gcGFnYWRvIGEgY29udHJhdGlzdGFzIGVuIHBlc29zIHkgZG9sYXJlcw0KY3VhZHJvXzIuNSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDUpDQoNCiMgcHJlY2lvcyBwYWdhZG9zIGEgY29udHJhdGlzdGFzIHZzIGNvYnJhZG9zIHBvciByZWZpbmFkb3JhcyBwcml2YWRhcyAocHJlY2lvIGNydWRvIG5ldXF1aW5hKQ0KY3VhZHJvXzIuNiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDYpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJwZXNvc19kZV8xOTcwX20zIikNCg0KIyB2YWxvcmVzIHVuaXRhcmlvcyBkZWwgcHJvZHVjdG8gY29tcHVlc3RvIGEgbml2ZWwgcHJvZHVjdG9yZXMgeSBjb25zdW1pZG9yZXMNCmN1YWRyb18yLjcgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA3KQ0KDQpgYGANCiANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMjIFRDUCANCnRjcF9hbnVhbCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9UQ1AvdGNwX2FudWFsLnhsc3giLCANCiAgICBjb2xfdHlwZXMgPSBjKCJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKSAlPiUgDQogIHJlbmFtZShhbmlvID0gZmVjaGEpDQoNCnRjcF9hbnVhbF9iIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL1RDUC90Y2NfdGNwX2hpc3Rvcmljby54bHN4IikgJT4lIA0KICByZW5hbWUodGNjID0gIGBUQ0MgZXhwb3J0YWNpb25lc2AsIHNvYnJldmFsdWFjaW9uID0gYFNvYnJldmFsdWFjacOzbiAoVENQLyBUQ0MpIDE5NTItMTk3Mj0xYCwNCiAgICAgICAgIHRjcCA9ICJUQ1AiKSAlPiUgDQogIG11dGF0ZShhbmlvID0gY2FzZV93aGVuKGFuaW8gPT0gNDMzMTMgfiAyMDE4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gYW5pbykpDQogIA0KdGNjX2RpY182MyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9UQ1AvdGNjX2RpY182My54bHN4IikNCg0KdGNjX21vbmVkYV9vcmlnaW5hbCA8LSAgdGNjX2RpY182MyAlPiUgDQogIHNlbGVjdCgtdXNkX2RpYykgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MgKSkgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gY2FzZV93aGVuKGFuaW8gPT0gMTk4NCB+ICIkYXJnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gbW9uZWRhKSwNCiAgICAgICAgICB0Y2NfbW9uZWRhID0gY2FzZV93aGVuKCAjaG9tb2dlbml6YW1vcyBsb3MgY2FtYmlvcyBkZSBtb25lZGENCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICJtJG4iIH4gdGNjKmNvbnZlcnNvcl9wZXNvcyRgbSRuYCAsDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiJGxleSIgfiB0Y2MqY29udmVyc29yX3Blc29zJGAkTGV5YCwgDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiJGFyZyIgfiB0Y2MqY29udmVyc29yX3Blc29zJGAkYWAsIA0KICAgICAgICAgICAgICAgICBtb25lZGEgPT0gIkEiIH4gdGNjKmNvbnZlcnNvcl9wZXNvcyRBLA0KICAgICAgICAgICAgICAgICBUIH4gdGNjKSApDQp0Y2NfbW9uZWRhX29yaWdpbmFsICANCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBJUEMNCmlwYyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9pbmRpY2VzL2lwY19tZW5zdWFsXzE5NjNfMjAxOC54bHN4IikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHpvbzo6bmEubG9jZihhbmlvKSkgJT4lIA0KICByZW5hbWUoaXBjXzA3MDMgPSBgQmFzZSA3LzIwMDMgPSAxYCkgJT4lIA0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZShhbmlvLCBtZXMsIHNlcCA9ICItIiksIG9yZGVycyA9ICJ5bSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGFuaW8sIG1lcyAsIGV2ZXJ5dGhpbmcoLikpDQoNCiNlc3RlIGVzdMOhIG1hbCAgDQojIGlwY192YXJpYWNpb24gPC0gIGlwYyAgJT4lIA0KIyAgIGZpbHRlcihtZXMgPT0gMSkgJT4lIA0KIyAgIG11dGF0ZShpcGNfdmFyID0gY2FtYmlvX3BvcmNlbnR1YWwoaXBjXzA3MDMpLA0KIyAgICAgICAgICBpcGNfdmFyPSBjYXNlX3doZW4oaXMubmEoaXBjX3ZhcikgfiAxLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGlwY192YXIpLA0KIyAgICAgICAgICAgaXBjXzAxNjIgPSBjYXNlX3doZW4oYW5pbyA9PSAxOTYyIH4gMSksDQojICAgICAgICAgIGlwY18wMTYyID0gbGFnKGlwY18wMTYyKStsYWcoaXBjXzAxNjIpKiBpcGNfdmFyKQ0KIyAgICAgICAgICANCiAgICAgICAgICMgaXBjXzAxNjIgPSBsYWcoaXBjXzAxNjIpICsgKGxhZyhpcGNfMDE2MikqIGlwY192YXIpKQ0KICAgICAgICAgIyBpcGNfMDE2MiA9IGNhc2Vfd2hlbiggaXMubmEoaXBjXzAxNjIpIH4gbGFnKGlwY18wMTYyKSArIGxhZyhpcGNfMDE2MikqaXBjX3ZhciApKQ0KDQoNCmlwY19wcm9tZWRpbyA8LSBpcGMgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGlwY18wMyA9IG1lYW4oaXBjXzA3MDMpKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKGFuaW8gLCBvcmRlcnMgPSAieSIpKSwgDQogICAgICAgICBpcGNfNzAgPSBnZW5lcmFyX2luZGljZShzZXJpZSA9IGlwY18wMywgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhPSBmZWNoYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9ICIxOTcwLTAxLTAxIiksDQogICAgICAgICBpcGNfMTggPSBnZW5lcmFyX2luZGljZShzZXJpZSA9IGlwY18wMywgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhPSBmZWNoYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9ICIyMDE4LTAxLTAxIikpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pKQ0KDQp3cml0ZS5jc3YoaXBjX3Byb21lZGlvLCBmaWxlID0gIkM6L0FyY2hpdm9zL0RhdG9zL2luZGljZXMvaXBjX3Byb21lZGlvLmNzdiIpDQoNCiMgaXBjXzcwIDwtIGlwY192YXJpYWNpb24gJT4lIA0KIyAgIHNlbGVjdChmZWNoYSwgaXBjXzAxNzApICU+JSANCiMgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSANCiMgICAgICAgICAgICAgICBzZWxlY3QoZmVjaGEsIGlwY183MCkpDQoNCiMgSVBJTSBiYXNlIDE5OTMgPSAxMDANCiMgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGFsIHBvciBtYXlvciAoSVBJTSkNCiMgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGLDoXNpY29zIGFsIHBvciBtYXlvciAoSVBJQikNCiMgw41uZGljZSBkZSBwcmVjaW9zIGLDoXNpY29zIGRlbCBwcm9kdWN0b3IgKElQUCkNCnNpcG1fc2VyaWU1Nl85NSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9JTkRFQy9JUElNL3NpcG0tc2VyaWU1Ni05NS54bHMiLA0KICAgIHNraXAgPSA2KSAlPiUgDQogIHJlbmFtZShhbmlvID0gbWVzLA0KICAgICAgICAgaXBpbV9uaXZlbF9ncmFsID0gZ2VuZXJhbC4uLjIgLA0KICAgICAgICAgaXBpbV9uaXZlbF9uYWMgPSBuYWNpb25hbGVzLi4uMywNCiAgICAgICAgIGlwaW1fbml2ZWxfaW1wbyA9IEltcG9ydGFkb3MsDQogICAgICAgICBpcGliX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uNSAsDQogICAgICAgICBpcGliX25pdmVsX25hYyA9IG5hY2lvbmFsZXMuLi42LA0KICAgICAgICAgaXBpYl9uaXZlbF9pbXBvID0gaW1wb3J0YWRvcywNCiAgICAgICAgIGlwcF9uaXZlbF9ncmFsID0gZ2VuZXJhbC4uLjgpICU+JSANCiAgZmlsdGVyKGdyZXBsKCAiMTkiLCBhbmlvKSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkNCg0KaXBpbV9iYXNlOTQgPC0gc2lwbV9zZXJpZTU2Xzk1ICU+JSBtdXRhdGUoaXBpbV9uaXZlbF9ncmFsXzk0ID0gZ2VuZXJhcl9pbmRpY2UoaXBpbV9uaXZlbF9ncmFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAxOTk0KSkgJT4lIA0KICBzZWxlY3QoYW5pbywgaXBpbV9uaXZlbF9ncmFsLCBpcGltX25pdmVsX2dyYWxfOTQpDQoNCiMgR2FuYW5jaWEgeSBwYmkgcGVzb3MgY29ycmllbnRlcyAoZnVlbnRlOiBKSUMvRU0gY29udGludWFjaW9uIEpJQykNCmdhbmFuY2lhX3lfcGJpIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2dhbmFuY2lhIHkgcGJpLnhsc3giKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgRXN0aW1hY2lvbiBkZSBvdHJvcyBhdXRvcmVzDQojICoqRXN0aW1hY2nDs24gSksqKg0KcmVudGFfaGlkcm9jYXJidXJvc19qayA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9yZW50YV9oaWRyb2NhcmJ1cm9zX2prLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIGZpbHRlcihpbmRpY2VfdGllbXBvIDw9IDIwMTkpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgcmVuYW1lKHByZWNpb19tZV9nYXMgPSBgR2FzIG5hdHVyYWwgbWVyY2FkbyBleHRlcm5vYCwNCiAgICAgICAgIHByZWNpb19taV9nYXMgPSBgcHJlY2lvIGludGVybm8gZ2FzIG5hdHVyYWxfcGVzb3NgLA0KICAgICAgICAgcHJlY2lvX21lX2NydWRvID0gYFByZWNpbyBjcnVkbyBtZXJjYWRvIGV4dGVybm9gLA0KICAgICAgICAgcHJlY2lvX21pX2NydWRvID0gYFByZWNpbyBjcnVkbyBtZXJjYWRvIGludGVybm9gLA0KICAgICAgICAgcHJlY2lvX2JvbGl2aWFfZ2FzX3VzZCA9IGBHYXMgTmF0dXJhbC4gUHJlY2lvIFZlbnRhIEJvbGl2aWEgYSBBcmdlbnRpbmEuLi4yNGAsIA0KICAgICAgICAgcHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zID0gYEdhcyBOYXR1cmFsLiBQcmVjaW8gVmVudGEgQm9saXZpYSBhIEFyZ2VudGluYS4uLjI1YCwNCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19jcnVkbyA9YFJlbnRhIHBvciB2ZW50YSBjcnVkbyBlbiBlbCBtZXJjYWRvIGludGVybm8gcG9yIGRlYmFqbyAvIGFycmliYSBwcmVjaW8gaW50ZXJuYWNpb25hbGAsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fZ2FzID0gJ1JlbnRhIHBvciB2ZW50YSBnYXMgZW4gZWwgbWVyY2FkbyBpbnRlcm5vIHBvciBkZWJham8gLyBhcnJpYmEgcHJlY2lvIGludGVybmFjaW9uYWwnLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gPSAnUmVudGEgY3J1ZG8gcG9yIGV4cG9ydGFjaW9uZXMgYSBwZXNvIHNvYnJldmFsdWFkbycsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgPSAnUmVudGEgZ2FzIHBvciBleHBvcnRhY2lvbmVzJywNCiAgICAgICAgIHJldGVuY2lvbmVzID0gIlJldGVuY2lvbmVzIiwNCiAgICAgICAgIHJlZ2FsaWFzID0gYFJlZ2FsaWFzIHRvdGFsYCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gJ1NVTUEgcmVudGEgb3Ryb3MgKHNpbiBpbXBvcnRhY2lvbmVzIG5pIHJldGVuY2lvbmVzKScpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9nYXMgPSAiTU1CVFUiLA0KICAgICAgICAgdW5pZGFkX2NydWRvID0gIkJhcnJpbGVzIiwNCiAgICAgICAgIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbyA9IGluZGljZV90aWVtcG8sIHVuaWRhZF9nYXMsIHVuaWRhZF9jcnVkbywgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcHJvZF9wZXRjcnUsIGV4cG9fY3J1ZG8sIGNydWRvX2ludGVybm8sDQogICAgICAgICBwcm9kX2dhc25hdCwgZXhwb19nYXMsIGdhc19pbnRlcm5vLA0KICAgICAgICAgcHJlY2lvX21lX2dhcyAsIHByZWNpb19taV9nYXMgLCBwcmVjaW9fbWVfY3J1ZG8sIHByZWNpb19taV9jcnVkbywgDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfdXNkICwgIHByZWNpb19ib2xpdmlhX2dhc19wZXNvcyAsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvICwgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2dhcyAsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyAsIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyAsDQogICAgICAgICByZXRlbmNpb25lcywgcmVnYWxpYXMsIA0KICAgICAgICAgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfdG90YWwpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcm9kX3BldGNydSIsICJleHBvX2NydWRvIiwgImNydWRvX2ludGVybm8iKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9xKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9jcnVkbyIsICJwcmVjaW9fbWVfY3J1ZG8iKSwNCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3ApICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJvZF9nYXNuYXQiLCAiZXhwb19nYXMiLCAiZ2FzX2ludGVybm8iKSwNCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zTU1CVFVfcSkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fbWlfZ2FzIiwgInByZWNpb19ib2xpdmlhX2dhc19wZXNvcyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9wKQ0KDQogIA0KcmVudGFfcHJlY2lvX2V4cG9fY3J1ZG9famsgPC0gcmVudGFfaGlkcm9jYXJidXJvc19qayAlPiUgDQogIHNlbGVjdChhbmlvLCBwcm9kX3BldGNydSwgZXhwb19jcnVkbywgY3J1ZG9faW50ZXJubywgDQogICAgICAgICBwcmVjaW9fbWlfY3J1ZG8sIHByZWNpb19tZV9jcnVkbywgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyApDQoNCg0KcmVudGFfcHJlY2lvX2V4cG9fZ2FzX2prIDwtIHJlbnRhX2hpZHJvY2FyYnVyb3NfamsgJT4lIA0KICBzZWxlY3QoYW5pbywgcHJvZF9nYXNuYXQsIGV4cG9fZ2FzLCBnYXNfaW50ZXJubywgDQogICAgICAgICBwcmVjaW9fbWlfZ2FzLCBwcmVjaW9fYm9saXZpYV9nYXNfcGVzb3MsIFRDQywgVENQLCANCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19nYXMsIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyApDQoNCg0KI0VzdGltYWNpw7NuIEJpbGwgeSBGYXJmYXJvIFJ1aXoNCnJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmVudGFfaGlkcm9jYXJidXJvc19GUi54bHN4IiApICU+JQ0KICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSAiUmVnYWzDrWFzIiwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gUmV0ZW5jaW9uZXMsDQogICAgICAgICBleHBvX3RjID0gIk1lZGlhbnRlIHNvYnJldmFsdWFjacOzbiBwYXJhIGV4cG9ydCIsDQogICAgICAgICBkaWZfcHJlY2lvcyA9ICJNZWRpYW50ZSBkaWZlcmVuY2lhIHByZWNpbyBpbnRlcm5vIGNvbiBpbnRlcm5hYyIpICU+JQ0KICBncm91cF9ieShhbmlvICwgaXBjXzA4KSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF4zfSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9cmVnYWxpYXMgKiBpcGNfMDggL2lwY18xOCwNCiAgICAgICAgIHJldGVuY2lvbmVzID1yZXRlbmNpb25lcyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgZXhwb190YyA9ZXhwb190YyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgZGlmX3ByZWNpb3MgPWRpZl9wcmVjaW9zICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICByZW50YV90b3RhbCA9IHJlZ2FsaWFzKyByZXRlbmNpb25lcysgZXhwb190YysgZGlmX3ByZWNpb3MsDQogICAgICAgICB1bmlkYWQgPSAibWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1pcGNfMDgpIA0KcmVudGFfaGlkcm9jYXJidXJvc19mcg0KDQojb3Ryb3MgYXV0b3Jlcw0KcmVudGFfYXV0b3JlcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvcmVudGFfYXV0b3Jlcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCg0KYGBgDQoNCg0KIyBWYXJpYWJsZXMNCg0KIyMgUHJvZHVjY2nDs24NCg0KRnVlbnRlczogDQoNCiogW01pbmlzdGVyaW8gZGUgSGFjaWVuZGEsIEluZm9ybWVzDQpTZWN0b3JpYWxlc10oaHR0cHM6Ly93d3cuYXJnZW50aW5hLmdvYi5hci9lY29ub21pYS9wb2xpdGljYWVjb25vbWljYS9yZWdpb25hbHlzZWN0b3JpYWwvaW5mb3JtZXNwcm9kdWN0aXZvcykgKDE5OTgtaG95KS4gDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIFJlZ2FsaWFzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcmVnYWxpYXMtZGUtcGV0cm9sZW8tY3J1ZG8tZ2FzLW5hdHVyYWwtZ2xwLWdhc29saW5hLXktY29uZGVuc2FkbykgKDE5OTgtaG95KQ0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBTRVNDTyBEb3duc3RyZWFtXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcHJvZHVjY2lvbi1kZS1wZXRyb2xlby15LWdhcy10YWJsYXMtZGluYW1pY2FzKSgxOTkzLWhveSkNCiogW0FudWFyaW8gZGUgY29tYnVzdGlibGVzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvYW51YXJpb3MtZGUtY29tYnVzdGlibGVzLTE5NTAtMTk5OSkgKDE5MTEtMTk5MikNCiogS296dWxqIHkgUGlzdG9uZXNpLiBSZXZpc3RhICBkZWwgSW5zdGl0dXRvIGRlIEVjb25vbcOtYSBFbmVyZ8OpdGljYSAoSURFRSkgLSBGdW5kYWNpw7NuIEJhcmlsb2NoZSAgKDE5NzAgLSAxOTg4KQ0KKiBbRUlBXShodHRwczovL3d3dy5laWEuZ292L2ludGVybmF0aW9uYWwvZGF0YS9jb3VudHJ5L0FSRy9wZXRyb2xldW0tYW5kLW90aGVyLWxpcXVpZHMvYW5udWFsLXBldHJvbGV1bS1hbmQtb3RoZXItbGlxdWlkcy1wcm9kdWN0aW9uP3BkPTUmcD0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwdmcmdT0wJmY9QSZ2PW1hcGJ1YmJsZSZhPS0maT1ub25lJnZvPXZhbHVlJiZ0PUMmZz1ub25lJmw9MjQ5LS02JnM9OTQ2OTQ0MDAwMDAmZT0xNTQ2MzAwODAwMDAwKSAoMTk4MCAtIDIwMTkpDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBDcnVkbw0KDQoqKnBvbmVyIGVuIGN1YW50byBubyBjb2luY2lkZSwgY3VhbnRvIGVzdGEgcG9yIGVuY2ltYSBvIHBvciBkZWJham8sIGJyZWNoYSwgZXhwbGljYXIgZW4gcXXDqSBhw7FvIHNlIGhhY2UgZWwgZW1wYWxtZSBlbiBsb3MgcHJlY2lvcyAqKg0KDQpMYSBwcm9kdWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8gZGUgbGFyZ28gcGxhem8gcHJvdmllbmUgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBkZSBsYSBjdWFsIGNvbnRhbW9zIGRhdG9zIGRlc2RlIDE5MTEgaGFzdGEgMTk5Mi4gU3VzIHZhbG9yZXMgcGFyYSBlbCBwZXLDrW9kbyAxOTgwLTE5OTIgY29pbmNpZGVuIGNvbiBsb3MgZGUgRUlBLCBwb3IgbG8gY3VhbCBwdWVkZW4gdXNhcnNlIGNvbW8gZnVlbnRlcyBhbHRlcm5hdGl2YXMuIEFzaW1pc21vLCBsYSBldm9sdWNpw7NuIGRlIFNFU0NPIGVzIHNpbWlsYXIgYSBsYSBkZSBFSUEsIHNhbHZvIHBvciBwZXF1ZcOxYXMgZGl2ZXJnZW5jaWFzIGVudHJlIDIwMDggeSAyMDEzLiBMYSBzZXJpZSBkZSBSZWdhbMOtYXMgcHJlc2VudGEgdW4gbml2ZWwgbWVub3IgcXVlIGxhcyBhbnRlcmlvcmVzIGRlYmlkbyBhIGxhcyBkZWR1Y2Npb25lcyBkZSBwcm9kdWNjacOzbiBxdWUgcmVhbGl6YW4gbGFzIGVtcHJlc2FzIHBhcmEgcGFnYXIgdW4gbWVub3Igbml2ZWwgZGUgUmVnYWzDrWFzIGhhY2lhIGxhcyBwcm92aW5jaWFzIGRvbmRlIHJlYWxpemFuIGxhIHByb2R1Y2Npw7NuLiBQb3Igw7psdGltbywgbGEgc2VyaWUgZGVsIE1pbmlzdGVyaW8gZGUgRWNvbm9tw61hIGNvaW5jaWRlIGNvbiBSZWdhbMOtYXMgZW4gc3VzIHByaW1lcm9zIGHDsW9zLCBsdWVnbyBwcmVzZW50YSB1biBuaXZlbCBpbnRlcm1lZGlvIGVudHJlIFJlZ2Fsw61hcyB5IFNFU0NPIHkgYSBwYXJ0aXIgZGUgMjAwOSB0b21hIGEgU0VTQ08gY29tbyBmdWVudGUuIFNhbHZvIGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBlbCByZXN0byBkZSBsYXMgc2VyaWVzIHByZXNlbnRhbiBkYXRvcyBoYXN0YSBsb3Mgw7psdGltb3MgYcOxb3MuIFBvciBsbyB0YW50bywgZWwgY3JpdGVyaW8gZGUgc2VsZWNjacOzbiBwYXJhIGxhIHNlcmllIGRlIHByb2R1Y2Npw7NuIGNvbiBsYSBxdWUgc2UgcmVhbGl6YXLDoW4gbG9zIGPDoWxjdWxvcyBlcyBlbCBzaWd1aWVudGU6DQoNCiogQ3JpdGVyaW8gZGUgY8OzbXB1dG8gcGFyYSBwcm9kdWNpY8OzbiBkZSBjcnVkbzogDQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgLSBhY3R1YWxpZGFkOiBTRVNDTyBEb3duc3RyZWFtDQoNCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBQUk9DRVNBUiBFU1RBIEJBU0UNCm1lY29uX2hpZHJvY2FyYnVyb3NfZGYgPC0gIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2hpZHJvY2FyYnVyb3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhpbmRpY2VfdGllbXBvID0gY29sX2RhdGUoZm9ybWF0ID0gIiVkLyVtLyVZIikpLCANCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAiSVNPLTg4NTktMSIpKQ0KdW5pcXVlKG1lY29uX2hpZHJvY2FyYnVyb3NfZGYkaW5kaWNhZG9yKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQW51YXJpbyBkZSBjb21idXN0aWJsZXMNCnByb2RfYW51YXJpbyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Byb2R1Y2Npb24vUHJvZHVjY2lvbl9EZXNkZV8xOTExIC0gY29waWEueGxzIikgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwgY3J1ZG9fYW51YXJpb19NbTMgPSAiUEVUUk9MRU8gKE1tMykiLCANCiAgZ2FzX2ggPSBgR0FTIE5BVFVSQUwgKE1pbGwuIG0zKWAsIGNhcmJvbl9oID0gYENBUkJPTiAoTVRuKSAoKilgKSAlPiUgDQogIG11dGF0ZShnYXNfYW51YXJpb19NTW0zICAgPSBhcy5kb3VibGUoZ2FzX2gpLCANCiAgICAgICAgIGNhcmJvbl9hbnVhcmlvX010biAgID0gYXMuZG91YmxlKGNhcmJvbl9oKSwNCiAgICAgICAgIGNydWRvX2FudWFyaW8gPSBjcnVkb19hbnVhcmlvX01tMyAqIDEwMDApICU+JSANCiAgc2VsZWN0KGFuaW8sIGNydWRvX2FudWFyaW8sIGdhc19hbnVhcmlvX01NbTMsIGNhcmJvbl9hbnVhcmlvX010biApDQoNCiMgUmV2aXN0YSBJREVFDQojIFByb2R1Y2Npw7NuIGNydWRvIHBvciBhZG1pbmlzdHJhY2nDs24geSBjb250cmF0b3MNCmN1YWRyb18yLjEgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSAxKSAlPiUgDQogIHJlbmFtZSh1bmlkYWQgPSAiLi4uNSIpDQoNCiNiYXNlIE1pbmlzdGVyaW8gZGUgSGFjaWVuZGENCmhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiA8LSAgcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vZGF0YXNldHMgdmllam9zL2hpZHJvY2FyYnVyb3MuY3N2IiwgDQogICAgbG9jYWxlID0gbG9jYWxlKGRhdGVfbmFtZXMgPSAiZXMiLCBlbmNvZGluZyA9ICJJU08tODg1OS0xIikpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShsdWJyaWRhdGU6OnBhcnNlX2RhdGVfdGltZShpbmRpY2VfdGllbXBvLCBvcmRlcnMgPSAiZG15IikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoMTozLCBmdWVudGUsIGluZGljZV90aWVtcG8sYWxjYW5jZV9pZCkpDQoNCiNsaXN0YSBjb24gaW5kaWNhZG9yZXMNCmxpc3RhX2ZpbHRybyA8LSB1bmlxdWUoaGlkcm9jYXJidXJvc19iYXNlX21lY29uJGluZGljYWRvcikNCg0KDQpwcm9kX21lY29uX2NydWRvIDwtIGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiAlPiUgDQogIGZpbHRlciggaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1szXSwNCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIlBldHLDs2xlbyBjcnVkbyIsDQogICAgICAgICBmcmVjdWVuY2lhX25vbWJyZSA9PSAiTWVuc3VhbCIpICU+JSAgDQogIG11dGF0ZShhbmlvID0geWVhcihmZWNoYSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSwgaW5kaWNhZG9yLCB1bmlkYWRfZGVfbWVkaWRhKSAlPiUgDQogIHN1bW1hcmlzZShjcnVkb19tZWNvbiA9IHN1bSh2YWxvcikpDQoNCg0KI0Jhc2UgcmVnYWxpYXMNCnByb2RfcmVnYWxpYXNfY3J1ZG8gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcm9kdWNjaW9uX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIm0zIiwNCiAgICAgICAgIGFuaW8gPW5hLmxvY2YoYW5pbyksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBNRVMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBNRVMsIGFuaW8sIHVuaWRhZCwgIlRPVEFMIENVRU5DQSIsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgcmVuYW1lKHByb2RfY3J1ZG9fbTMgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZShjcnVkb19yZWdhbGlhcyA9IHN1bShwcm9kX2NydWRvX20zKSkNCg0KI0Jhc2UgU0VTQ08gLmNzdiAgKFByZSAyMDA5KQ0KcHJvZF9zZXNjb19jcnVkb19hIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL3Byb2R1Y2Npbi1kZS1wZXRybGVvLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgJT4lDQogIHNlbGVjdChhbmlvLCBtZXMsaWRjb25jZXB0bywgY29uY2VwdG8sIENhbnRpZGFkICkgJT4lDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKSAlPiUNCiAgIyBmaWx0ZXIoIWlkY29uY2VwdG8gJWluJSBjKDQsIDUsIDcsIDgsIDkJKSkgJT4lDQogIGZpbHRlcihpZGNvbmNlcHRvICVpbiUgYygxLDIsMywgNikpICU+JQ0KICBncm91cF9ieShhbmlvKSAlPiUNCiAgc3VtbWFyaXNlKGNydWRvX3Nlc2NvID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKSAlPiUNCiAgbXV0YXRlKHVuaWRhZCA9ICJtMyIpDQoNCiMgQmFzZSBTRVNDTyAoUG9zdCAyMDA5KQ0KcHJvZF9zZXNjb19jcnVkb19iIDwtIHJlYWRfY3N2KA0KICAiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtcGV0cmxlby1wb3IteWFjaW1pZW50by5jc3YiKSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsaWRjb25jZXB0bywgY29uY2VwdG8sIGNhbnRpZGFkICkgJT4lDQogICMgZmlsdGVyKCFpZGNvbmNlcHRvICVpbiUgYyg0LCA1LCA3LCA4LCA5CSkpICU+JQ0KICBmaWx0ZXIoaWRjb25jZXB0byAlaW4lIGMoMSwyLDMsIDYpKSU+JQ0KICBncm91cF9ieShhbmlvKSAlPiUNCiAgc3VtbWFyaXNlKGNydWRvX3Nlc2NvID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKSAlPiUNCiAgbXV0YXRlKHVuaWRhZCA9ICJtMyIpDQoNCnByb2Rfc2VzY29fY3J1ZG8gPC0gcHJvZF9zZXNjb19jcnVkb19hICU+JSANCiAgYmluZF9yb3dzKHByb2Rfc2VzY29fY3J1ZG9fYikNCg0KI0VJQQ0KDQojdW5pZGFkIG9yaWdpbmFsID0gYmFycmVscyBwZXIgZGF5DQoNCiMgVG90YWwgUGV0cm9sZXVtIGFuZCBvdGhlciBsaXF1aWRzIHByb2R1Y3Rpb24gPSBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIHByb2R1Y3Rpb24gKyBSZWZpbmVyeSBwcm9jZXNzaW5nIGdhaW4NCiMgQ3J1ZGUgb2lsLCBOR1BMLCBhbmQgb3RoZXIgbGlxdWlkcyBwcm9kdWN0aW9uID0gQ3J1ZGUgb2lsIGluY2x1ZGluZyBsZWFzZSBjb25kZW5zYXRlIHByb2R1Y3Rpb24gKyBOYXR1cmFsIGdhcyBwbGFudCBsaXF1aWRzIHByb2R1Y3Rpb24gKyBPdGhlciBsaXF1aWRzIHByb2R1Y3Rpb24NCg0KcHJvZF9laWFfY3J1ZG8gPC0gIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9vaWxfcHJvZHVjdGlvbl9hcmcuY3N2IiwgDQogICAgdHJpbV93cyA9IEZBTFNFLCBza2lwID0gMSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKEFQSSkpICU+JSANCiAgc2VsZWN0KC1BUEkpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KICBzcHJlYWQoLiwNCiAgICAgICAgIGtleSA9IFgyLA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikgJT4lIA0KICByZW5hbWUodG90YWxfb2lsX2FuZF9vdGhlciA9IGAgICAgICAgIFRvdGFsIHBldHJvbGV1bSBhbmQgb3RoZXIgbGlxdWlkcyAoTWIvZClgLA0KICAgICAgICAgY3J1ZGVfb2lsX2NvbmRlbnNhdGUgPSBgICAgICAgICAgICAgICAgIENydWRlIG9pbCBpbmNsdWRpbmcgbGVhc2UgY29uZGVuc2F0ZSAoTWIvZClgLA0KICAgICAgICAgbmF0dXJhbF9nYXMgPSBgICAgICAgICAgICAgICAgIE5HUEwgKE1iL2QpYCwNCiAgICAgICAgIG90aGVyX2xpcXVpZHMgPSBgICAgICAgICAgICAgICAgIE90aGVyIGxpcXVpZHMgKE1iL2QpYCwNCiAgICAgICAgIGNydWRlX29pbF9uZ3BsX290aGVyX2xpcXVpZHMgPSBgICAgICAgICAgICAgQ3J1ZGUgb2lsLCBOR1BMLCBhbmQgb3RoZXIgbGlxdWlkcyAoTWIvZClgLA0KICAgICAgICAgcmVmaW5lcnlfcHJvY2Vzc2luZ19nYWluID0gYCAgICAgICAgICAgIFJlZmluZXJ5IHByb2Nlc3NpbmcgZ2FpbiAoTWIvZClgKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IChjKCJjcnVkZV9vaWxfY29uZGVuc2F0ZSIsICJuYXR1cmFsX2dhcyIsICJvdGhlcl9saXF1aWRzIiwgDQogICAgICAgICAgICAgICAgICAiY3J1ZGVfb2lsX25ncGxfb3RoZXJfbGlxdWlkcyIsICJyZWZpbmVyeV9wcm9jZXNzaW5nX2dhaW4iICAsInRvdGFsX29pbF9hbmRfb3RoZXIiKSksDQogICAgLmZ1bnMgPSBmdW5jdGlvbih4KSB7eCAqIDM2NSAqIDEwMDB9KSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pLA0KICAgICAgICAgdW5pZGFkID0gImJhcnJpbGVzIikNCg0KI0VJQSBhbGwgZGF0YQ0KZWlhX2FsbF9kYXRhIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9hcmdlbnRpbmEvSU5ULUV4cG9ydC0wOS0xNy0yMDIwXzExLTE1LTE2LmNzdiIsIA0KICAgIHNraXAgPSAxKQ0KDQoNCiMgQ29tcGFyYWNpw7NuIGVudHJlIHNlcmllcw0KcHJvZF9tZXJnZV9jcnVkbyA8LSAgcHJvZF9yZWdhbGlhc19jcnVkbyAlPiUgDQogIGxlZnRfam9pbihwcm9kX21lY29uX2NydWRvICAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjcnVkb19tZWNvbikpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBjcnVkb19yZWdhbGlhcywgY3J1ZG9fbWVjb24pICU+JSANCiAgbGVmdF9qb2luKHByb2Rfc2VzY29fY3J1ZG8pICU+JSANCiAgZnVsbF9qb2luKHByb2RfYW51YXJpbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjcnVkb19hbnVhcmlvKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZSh1bmlkYWQgPSAibTMiKSkgJT4lIA0KICAjIG11dGF0ZShkaWYgPSAgY3J1ZG9fcmVnYWxpYXMvY3J1ZG9fbWVjb24tMSkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCAgICJjcnVkb19yZWdhbGlhcyIgLCJjcnVkb19tZWNvbiIsICAgDQogICAgICAgICAgICAgICAgICAgICAgICJjcnVkb19zZXNjbyIsICAgICJjcnVkb19hbnVhcmlvIiApLCANCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3EpICU+JSAgDQogIGxlZnRfam9pbihwcm9kX2VpYV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjcnVkb19laWEgPSBjcnVkZV9vaWxfY29uZGVuc2F0ZSkpICU+JSANCiAgIG11dGF0ZShwcm9kX2NydWRvID0gIGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IGNydWRvX2FudWFyaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTIgfiBjcnVkb19zZXNjbyksDQogICAgICAgICAgdW5pZGFkID0gImJhcnJpbGVzIiwgDQogICAgICAgICAgdmFyaWFibGUgPSAgIlByb2R1Y2Npw7NuIGRlIGNydWRvIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIpICAlPiUNCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgdW5pZGFkLCBwcm9kX2NydWRvLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShyZWdhbGlhcyA9IGNydWRvX3JlZ2FsaWFzLA0KICAgICAgICAgbWVjb24gPSBjcnVkb19tZWNvbiwNCiAgICAgICAgIHNlc2NvID0gY3J1ZG9fc2VzY28sDQogICAgICAgICBhbnVhcmlvX2NvbWJ1c3RpYmxlcyA9IGNydWRvX2FudWFyaW8sDQogICAgICAgICBlaWEgPSBjcnVkb19laWEpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQoNCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfY3J1ZG8sIGZpbGUgPSAicmVzdWx0YWRvcy9wcm9kdWNjaW9uX2NydWRvLmNzdiIpDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJvZF9tZXJnZV9jcnVkbywgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3Byb2R1Y2Npb25fY3J1ZG8ueGxzeCIpDQoNCiNkaWZlcmVuY2lhIHByb21lZGlvIGRlbCA2JSBlbnRyZSBsYXMgYmFzZXMgKGVzIG1heW9yIGxhIGRlIG1lY29uKQ0KIyBzdW1tYXJ5KHByb2RfbWVyZ2VfY3J1ZG8pDQoNCg0KI0V4aXN0ZW5jaWFzDQpleGlzdGVuY2lhc19wZXRyb2xlbyA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9leGlzdGVuY2lhc19jcnVkby54bHN4IikgJT4lDQogIGZpbHRlcighKGlzLm5hKGV4aXN0ZW5jaWFzICkpKSAlPiUgDQogIHJlbmFtZShleGlzdGVuY2lhc19jcnVkbyA9IGV4aXN0ZW5jaWFzKSAlPiUgDQogIG11dGF0ZShleGlzdGVuY2lhc19jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9xKGV4aXN0ZW5jaWFzX2NydWRvKSwNCiAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIpDQoNCiMgcGxvdChleGlzdGVuY2lhc19wZXRyb2xlbyRhbmlvLCBleGlzdGVuY2lhc19wZXRyb2xlbyRleGlzdGVuY2lhc19jcnVkbykNCg0KYGBgDQoNCjxicj4NCioqVGFibGEgMS4gUHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIGVuIEFyZ2VudGluYSBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMgKGJhcnJpbGVzKSoqDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJvZF9jcnVkbykNCiANCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3RseShwcm9kX21lcmdlX2NydWRvICU+JSANCiAgbXV0YXRlKHJlZ2FsaWFzID0gY2FzZV93aGVuKHJlZ2FsaWFzID09IDAgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhcykpICU+JQ0KICAgIHNlbGVjdCgtcHJvZF9jcnVkbykgJT4lIA0KICBnYXRoZXIoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yLCA0Om5jb2woLikpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gMS4gUHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvLg0KICAgICAgICBBcmdlbnRpbmEgKDE5MTEgLSAyMDIwKSIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBCYXJyaWxlcyIsDQogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IGVsYWJvcmFjacOzbiBwcm9waWEgZW4gYmFzZSBhIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBFSUEsIE1pbmlzdGVyaW8gZGUgRWNvbm9tw61hLCBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoQmFzZSBSZWdhbMOtYXMgeSBTRVNDTykiKSsNCiAgIyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnVuaXRfZm9ybWF0KHVuaXQgPSIiLCBzY2FsZSA9IDFlLTYpKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQoNCg0KIyMjIFByb2R1Y2Npw7NuIGRlIEdhcyBOYXR1cmFsDQoNCkFsIGlndWFsIHF1ZSBlbiBsYSBwcm9kdWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8sIGxhIHNlcmllIGRlIGxhcmdvIHBsYXpvIGRlIHByb2R1Y2Npw7NuIGRlIGdhcyBwcm92aWVuZSBkZWwgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIGRlIGxhIGN1YWwgY29udGFtb3MgZGF0b3MgZGVzZGUgMTkxMyBoYXN0YSAxOTkyLiBBIGRpZmVyZW5jaWEgZGVsIGNydWRvLCBzdXMgdmFsb3JlcyBwYXJhIGVsIHBlcsOtb2RvIDE5ODAtMTk5MiBubyBjb2luY2lkZW4gY29uIGxvcyBkZSBFSUEsIHBlcm8gZXN0w6Egw7psdGltYSBzw60gY29pbmNpZGUgY29uIGxvcyBkZSBSZWdhbMOtYXMgZW50cmUgMTk5OSB5IDIwMTUuIEVuIGNhbWJpbywgbGEgc2VyaWUgZGUgU0VTQ08sIHRpZW5kZSBhIGNvbnRpbnVhciBsYSBldm9sdWNpw7NuIGRlIEVJQSB5IFJlZ2Fsw61hcywgcGVybyBjb24gZWwgbml2ZWwgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBwb3IgbG8gcXVlIGFtYm9zIHBhcmVzIGRlIHNlcmllcyBwdWVkZW4gZW1wYWxtYXIgY29oZXJlbnRlbWVudGUgc2Vnw7puIHN1IG5pdmVsLiBOdWV2YW1lbnRlLCBsb3MgdmFsb3JlcyBkZSBsYSBiYXNlIGRlIFJlZ2Fsw61hcyBzb24gbWVub3JlcyBkZWJpZG8gYSBsYXMgZGVkdWNjaW9uZXMgZGUgcHJvZHVjY2nDs24gcGFyYSB0cmlidXRhciBtZW5vcyByZWdhbMOtYXMuIExhIHNlcmllIGRlbCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSB0b21hIGxvcyB2YWxvcmVzIGRlIFNFU0NPLlBvciBsbyB0YW50bywgZWwgY3JpdGVyaW8gZGUgc2VsZWNjacOzbiBwYXJhIGxhIHNlcmllIGRlIHByb2R1Y2Npw7NuIGRlIGdhcyBwYXJhIGxvcyBjw6FsY3Vsb3MgZXMgZWwgc2lndWllbnRlOg0KDQoqIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIGxhIHByb2R1Y2Npw7NuIGRlIGdhczoNCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0Jhc2UgTUVDT04NCnByb2RfbWVjb25fZ2FzIDwtIGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiAlPiUgDQogIGZpbHRlcihpbmRpY2Fkb3IgPT0gbGlzdGFfZmlsdHJvWzNdLA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiR2FzIG5hdHVyYWwiLA0KICAgICAgICAgZnJlY3VlbmNpYV9ub21icmUgPT0gIk1lbnN1YWwiKSAlPiUgIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUsIGluZGljYWRvciwgdW5pZGFkX2RlX21lZGlkYSkgJT4lIA0KICBzdW1tYXJpc2UoZ2FzX21lY29uID0gc3VtKHZhbG9yKSkNCg0KI0Jhc2UgcmVnYWxpYXMNCnByb2RfcmVnYWxpYXNfZ2FzIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJvZHVjY2lvbl9nYXNfcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDkU8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsZXMgZGUgbTMiLA0KICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbyksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBNRVMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCB1bmlkYWQsICJUT1RBTCBDVUVOQ0EiLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShwcm9kX2dhc19NbTMgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQgKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIHN1bW1hcmlzZShnYXNfcmVnYWxpYXMgPSBzdW0ocHJvZF9nYXNfTW0zKSkNCg0KI0Jhc2UgU0VTQ08NCiNwcmUgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgQ2FudGlkYWQgKSAlPiUNCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpICU+JQ0KICBmaWx0ZXIoaWRjb25jZXB0byAhPSA0KSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KI3Bvc3QgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYiA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLXBvci15YWNpbWllbnRvLmNzdiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQgKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzKSklPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KcHJvZF9zZXNjb19nYXMgPC0gcHJvZF9zZXNjb19nYXNfYSAlPiUNCiAgYmluZF9yb3dzKHByb2Rfc2VzY29fZ2FzX2IpDQoNCg0KI0VJQQ0KcHJvZF9laWFfZHJ5X25hdHVyYWxfZ2FzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9EcnlfbmF0dXJhbF9nYXNfcHJvZHVjdGlvbl9BcmdlbnRpbmFfQW5udWFsLmNzdiIsIA0KICAgIHNraXAgPSA0KSAgJT4lIA0KICByZW5hbWUoYW5pbyA9IFllYXIsDQogICAgICAgICBwcm9kX2VpYSA9IGBTZXJpZXMgSUQ6IElOVEwuMjYtMS1BUkctQkNGLkEgYmlsbGlvbiBjdWJpYyBmZWV0YCkgJT4lIA0KICBtdXRhdGUocHJvZF9laWEgPSBjb252ZXJzb3JfZnQzbTNfcShwcm9kX2VpYSAqIDEwMDAwMDApLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KDQojIENvbXBhcmFjacOzbiBlbnRyZSBzZXJpZXMNCnByb2RfbWVyZ2VfZ2FzIDwtICBwcm9kX3JlZ2FsaWFzX2dhcyAlPiUgDQogIGxlZnRfam9pbihwcm9kX21lY29uX2dhcyAgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZ2FzX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGdhc19yZWdhbGlhcywgZ2FzX21lY29uKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3Nlc2NvX2dhcykgJT4lICANCiAgZnVsbF9qb2luKHByb2RfYW51YXJpbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBnYXNfYW51YXJpbyA9IGdhc19hbnVhcmlvX01NbTMgKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShnYXNfYW51YXJpbyA9IGdhc19hbnVhcmlvICogMTAwMCwNCiAgICAgICAgICAgICAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX2VpYV9kcnlfbmF0dXJhbF9nYXMgJT4lIHJlbmFtZShnYXNfZWlhID0gcHJvZF9laWEpKSAlPiUgDQogIG11dGF0ZShwcm9kX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IGdhc19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gZ2FzX3Nlc2NvKSwNCiAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJvZHVjY2nDs24gZGUgZ2FzIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgdW5pZGFkLCBwcm9kX2dhcywgZXZlcnl0aGluZyguKSkgJT4lIA0KICAgZmlsdGVyKCFpcy5uYShwcm9kX2dhcykpICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gZ2FzX3JlZ2FsaWFzLA0KICAgICAgICAgbWVjb24gPSBnYXNfbWVjb24sDQogICAgICAgICBzZXNjbyA9IGdhc19zZXNjbywNCiAgICAgICAgIGFudWFyaW9fY29tYnVzdGlibGVzID1nYXNfYW51YXJpbywNCiAgICAgICAgIGVpYSA9IGdhc19laWEpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQoNCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9nYXMuY3N2IikNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcm9kX21lcmdlX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3Byb2R1Y2Npb25fZ2FzLnhsc3giKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgMTQlIGVudHJlIGxhcyBiYXNlcyAoZXMgbWF5b3IgbGEgZGUgbWVjb24pDQojIHN1bW1hcnkocHJvZF9tZXJnZV9nYXMpDQoNCnByb2RfbWVyZ2VfZ2FzX01NQlRVIDwtIHByb2RfbWVyZ2VfZ2FzICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9xKHgqMTAwMCl9KSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTU1CVFUiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQpwcm9kX21lcmdlX2dhc19iZXAgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIG11dGF0ZV9hbGwoY29udmVyc29yX01NQlRVYmVwX3EpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJCRVAiKQ0KICANCiMgd3JpdGUuY3N2KHByb2RfbWVyZ2VfZ2FzX2JlcCwgZmlsZSA9ICJyZXN1bHRhZG9zL3Byb2RfbWVyZ2VfZ2FzX2JlcC5jc3YiKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgMi4gUHJvZHVjY2nDs24gZGUgZ2FzIG5hdHVyYWwgZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoTU1CVFUpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdCgtcHJvZF9nYXMpDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdGx5KHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgc2VsZWN0KC1wcm9kX2dhcykgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IsIDQ6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyAyLiBQcm9kdWNjacOzbiBkZSBnYXMuDQogICAgICAgIEFyZ2VudGluYSAoMTkxMyAtIDIwMjApIiwNCiAgICAgICB5ID0gIk1NQlRVIiwNCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogZWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIEVJQSwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEsIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcyB5IFNFU0NPKSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQojIyMgUHJvZHVjY2lvbiB0b3RhbA0KYGBge3J9DQpwcm9kdWNjaW9uX3RvdGFsIDwtIHByb2RfbWVyZ2VfZ2FzX2JlcCAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQscHJvZF9jcnVkbykgJT4lICBtdXRhdGUodW5pZGFkID0iQkVQIikgKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3RvdGFsX2JlcCA9IHByb2RfY3J1ZG8gKyBwcm9kX2dhcykNCg0KDQpgYGANCg0KDQoNCiMjIENydWRvIHByb2Nlc2Fkbw0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KDQpgYGANCg0KDQojIyBWZW50YXMNCiBDcnVkbyB5IEdhcw0KDQoqIFtTRVNDTyAtIFJlZmluYWNpw7NuIHkgQ29tZXJjaWFsaXphY2nDs24gZGUgcGV0csOzbGVvLCBnYXMgeSBkZXJpdmFkb3NdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWZpbmFjaW9uLXktY29tZXJjaWFsaXphY2lvbi1kZS1wZXRyb2xlby1nYXMteS1kZXJpdmFkb3MtdGFibGFzLWRpbmFtaWNhcykNCg0KIERhdG9zIGRlIGNhbnRpZGFkZXMNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojY29tcHJhcyBlbXByZXNhcyBkZWwgc2VjdG9yDQpjb21wcmFzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi9jb21wcmFzLmNzdiIpDQoNCiN2ZW50YXMgbWRvIGludGVybm8uIGNhbnRpZGFkZXMuIHBvc3QgMjAxMA0KdmVudGFzX21lcmNhZG9fcHJvZHVjdG9fZW1wcmVzYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vdmVudGFzLW1lcmNhZG8tcHJvZHVjdG8tZW1wcmVzYS5jc3YiLCANCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAiSVNPLTg4NTktMSIpKQ0KDQojdmVudGFzIG1kbyBpbnRlcm5vLiBjYW50aWRhZGVzLiBwb3N0IDIwMTANCnZlbnRhc19hX2VtcHJlc2FzX2RlbF9zZWN0b3IgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL3ZlbnRhcy1hLWVtcHJlc2FzLWRlbC1zZWN0b3IuY3N2IikNCg0KYGBgDQoNCg0KIyMgUHJlY2lvIE1lcmNhZG8gSW50ZXJubw0KDQpGdWVudGVzOiANCg0KKiBbQmFzZSBNaW5pc3RlcmlvIGRlIEhhY2llbmRhLCBJbmZvcm1lcw0KU2VjdG9yaWFsZXNdKGh0dHBzOi8vd3d3LmFyZ2VudGluYS5nb2IuYXIvZWNvbm9taWEvcG9saXRpY2FlY29ub21pY2EvcmVnaW9uYWx5c2VjdG9yaWFsL2luZm9ybWVzcHJvZHVjdGl2b3MpDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYS1SZWdhbGlhc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3JlZ2FsaWFzLWRlLXBldHJvbGVvLWNydWRvLWdhcy1uYXR1cmFsLWdscC1nYXNvbGluYS15LWNvbmRlbnNhZG8pDQogICsgUG9yIGF1c2VuY2lhIGRlIGluZm9ybWFjacOzbiwgZWwgcHJlY2lvIGRlIHJlZ2FsaWFzIGVudHJlIDE5OTMgeSAxOTk4IGVzIGVsIHByZWNpbyB0b3RhbCAoZXMgZGVjaXIsIGVzIHVuIHBvbmRlcmFkbyBxdWUgaW5jbHV5ZSB0YW1iacOpbiBlbCBwcmVjaW8gZGVsIG1lcmNhZG8gZXh0ZXJubykuIEVuIGxvcyBhw7FvcyBwb3N0ZXJpb3JlcywgZGljaG8gcHJlY2lvIHPDrSBjb3JyZXNwb25kZSBhbCBkZWwgbWVyY2FkbyBpbnRlcm5vLiAgDQoqIEtvenVsaiB5IFBpc3RvbmVzaS4gUmV2aXN0YSAgZGVsIEluc3RpdHV0byBkZSBFY29ub23DrWEgRW5lcmfDqXRpY2EgKElERUUpIC0gRnVuZGFjacOzbiBCYXJpbG9jaGUgICgxOTcwIC0gMTk4OCkuIFByZWNpbyBvZmljaWFsIGludGVybm8gZGUgbGEgY3VlbmNhIG5ldXF1aW5hIGEgdGFzYSBkZSBjYW1iaW8gb2ZpY2lhbC4gTGFzIGZ1ZW50ZXMgdXRpbGl6YWRhcyBkZSBlc3RhIHJldmlzdGEgc29uIFNlY3JldGFyaWEgZGUgRW5lcmfDrWEsIFlQRiwgR2FzIGRlbCBFc3RhZG8sIEJvbGV0aW4gSW5mb3JtYXRpdm8gZGUgVGVjaGludCB5IHNlcmllcyBwcm9waWFzIGRlIElERUUNCiogTWVtb3JpYSBBbnVhbCB5IGJhbGFuY2VzIGNvbnRhYmxlcyBkZSBZUEYgKHZhcmlvcyBhw7FvcykuIFByZWNpbyBpbnRlcm8gcHJvbWVkaW8gcmVzdWx0YW50ZSBkZSBsYSByZWxhY2nDs24gZW50cmUgdmVudGFzIHkgY2FudGlkYWRlcyBwcm9kdWNpZGFzLg0KKiBQcmVjaW9zIGFudWFyaW8uICoqRkFMVEEgQlVTQ0FSKioNCg0KKioqdmVyIGRlIGRvbmRlIHNhY2FuIGVsIFRDQyoqKg0KKioqY2FtYmlhciBwcmVjaW8gZGVsIDkyIHBvciBtZWNvbiBlc3RpbWFkbyB5IHZhbG9yZXMgcmVzdGFudGVzIHBvciBlc3RpbWFkbyBkZSBpZGVlKioqDQoNCiMjIyMgIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgQ3J1ZG8NCg0KKiBDcml0ZXJpbyBwYXJhIHByZWNpb19jcnVkbzogDQogICsgMTk2MyBhIDE5NjU6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRSBhanVzdGFkbyBjb24gZWwgw61uZGljZSBkZWwgcHJlY2lvIGRlbCBBbnVhcmlvIGRlIFlQRiANCiAgKyAxOTg5IGEgMTk5MTogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTY2IGEgMTk4ODogS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MjogTUVDT04gYWp1c3RhZG8gY29uIGxhIHZhcmlhY2nDs24gZGVsIMONbmRpY2UgZGUgcHJlY2lvcyBpbnRlcm5vcyBhbCBwb3IgbWF5b3IgKElQSU0pDQogICsgMTk5MyBlbiBhZGVsYW50ZTogTUVDT04gDQogDQogIA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNNZW1vcmlhcyBkZSBZUEYNCnZ0YXNfcHJlY2lvX21lbW9feXBmX2NydWRvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVtb3JpYSBZUEYvdnRhc192YWxvcl9jYW50aWRhZF9wcmVjaW9fY3J1ZG8ueGxzeCIpICU+JSANCiAgcmVuYW1lKGNhbnRfdmVuZGlkYWQgPSAibTMiLCB2YWxvcl92ZW5kaWRvID0gInZhbG9yIiwgcHJlY2lvX2EgPSAiJC9tMyIsIA0KICAgICAgICAgdGNjX2RpYyA9ICJDb3RpeiBkaWMgVSRTIiwgcHJlY2lvX3VzZCA9ICJVJFMgKGEgZGljaWVtYnJlIGRlIGNhZGEgYcOxbykiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfY2FudCA9ICJtMyIsDQogICAgICAgICBwcmVjaW9fbWlfcGVzb3NfeXBmX2NydWRvID0gdmFsb3JfdmVuZGlkby9jYW50X3ZlbmRpZGFkLCANCiAgICAgICAgIHByZWNpb19taV95cGZfY3J1ZG8gPSBwcmVjaW9fbWlfcGVzb3NfeXBmX2NydWRvIC8gdGNjX2RpYykgJT4lIA0KICAjIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JQ0KICAjIG11dGF0ZShwcmVjaW9fbWlfdXNkX3lwZl9jcnVkbyA9IHByZWNpb19taV95cGZfY3J1ZG8gLyB0Y2MpICU+JSAjcmVjYWxjdWxvIGRlIHByZWNpbyBjb24gbnVldm8gVEMNCiAgc2VsZWN0KGFuaW8sdW5pZGFkX2NhbnQsIG1vbmVkYSwgdmFsb3JfdmVuZGlkbywgY2FudF92ZW5kaWRhZCwgDQogICAgICAgICBwcmVjaW9fbWlfcGVzb3NfeXBmX2NydWRvLHRjY19kaWMsICBwcmVjaW9fbWlfeXBmX2NydWRvKQ0KDQojIEJhc2UgTUVDT04NCnByZWNpb19taV9tZWNvbl9jcnVkbyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1syXSwgDQogICAgICAgICBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlID09ICJQZXRyw7NsZW8gY3J1ZG8iLA0KICAgICAgICAgYWxjYW5jZV90aXBvID09ICJQQUlTIikgJT4lDQogIG11dGF0ZShhbmlvID0geWVhcihmZWNoYSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX21pX21lY29uX2NydWRvID0gbWVhbih2YWxvcikpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJ1c2QvbTMiKQ0KDQoNCiNNRUNPTiAvIENVRU5UQVMgTkFDSU9OQUxFUyANCnByZWNpb3NfbWVjb24gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJQcmVjaW9zIiwgc2tpcCA9IDcpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiLi4uMSIsDQogICAgICAgICBtZXMgPSAiLi4uMiIsDQogICAgICAgICBwcmVjaW9fY29icmVfY19sYiA9ICJDb3RpemFjacOzbiBCb2xzYSBkZSBMb25kcmVzIChMTUUpIiwNCiAgICAgICAgIHByZWNpb19vcm9fdXNkX296dCA9ICAiQ290aXphY2nDs24gQm9sc2EgZGUgTnVldmEgWW9yayAoQ09NRVgpIiwNCiAgICAgICAgIHByZWNpb19wbGF0YV91c2Rfb3p0ID0gIkNvdGl6YWNpw7NuIExvbmRvbiBCdWxsaW9uIE1hcmtldCBBc3NvY2lhdGlvbiAoTEJNQSkiLA0KICAgICAgICAgcHJlY2lvX2NpbmNfY19sYiA9ICJDb3RpemFjacOzbiBMTUUiLA0KICAgICAgICAgcHJlY2lvX2hpZXJyb191c2RfdG4gPSAiNjcsNTUlIEJyYXNpbCIsDQogICAgICAgICBwcmVjaW9fcGxvbW9fdXNkX3RuID0gIkxvbmRvbiBNZXRhbCBFeGNoYW5nZSIsDQogICAgICAgICBwcmVjaW9fZ2FzX21lX3Blc29zX01tMyA9ICJtZXJjYWRvIGV4dGVybm8uLi45IiwNCiAgICAgICAgIHByZWNpb19nYXNfbWlfcGVzb3NfTW0zID0gIm1lcmNhZG8gaW50ZXJuby4uLjEwIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfbTMgPSAibWVyY2FkbyBleHRlcm5vLi4uMTEiLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgID0gIi4uLjEyIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19taV91c2RfbTMgPSAibWVyY2FkbyBpbnRlcm5vLi4uMTMiLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21pX3VzZF9iYmwgID0gIi4uLjE0IiwNCiAgICAgICAgIHByb21lZGlvX2JyZW50X2R1YmFpX3d0aV91c2RfYmJsID0gIlByb21lZGlvIEJyZW50LUR1YmFpLVdUSSIsDQogICAgICAgICBicmVudF91a191c2RfYmJsID0iQnJlbnQgIFB1ZXJ0b3MgR3JhbiBCcmV0YcOxYSIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fZ2FzX21lX3Blc29zX01tMyA9IG1lYW4ocHJlY2lvX2dhc19tZV9wZXNvc19NbTMsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcmVjaW9fZ2FzX21pX3Blc29zX01tMyA9IG1lYW4oIHByZWNpb19nYXNfbWlfcGVzb3NfTW0zLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgPSBtZWFuKCBwcmVjaW9fY3J1ZG9fbWVfdXNkX2JibCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHByZWNpb19jcnVkb19taV91c2RfYmJsID0gbWVhbiggcHJlY2lvX2NydWRvX21pX3VzZF9iYmwsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCA9IG1lYW4oIHByb21lZGlvX2JyZW50X2R1YmFpX3d0aV91c2RfYmJsLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgYnJlbnRfdWtfdXNkX2JibCA9IG1lYW4oIGJyZW50X3VrX3VzZF9iYmwsIG5hLnJtID0gVCkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCkgJT4lIA0KICBtdXRhdGUoIHByZWNpb19jcnVkb19tZV9wZXNvc19iYmwgPSAgcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgKlRDQywNCiAgICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfcGVzb3NfYmJsID0gIHByZWNpb19jcnVkb19taV91c2RfYmJsICpUQ0MpDQoNCg0KIyMgQmFzZSByZWdhbGlhcw0KcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJlY2lvX21lcmNhZG9faW50ZXJub19jcnVkb19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JQ0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfdGlwb19jcnVkbyA9ICJUT1RBTCBUSVBPIERFIENSVURPIikgJT4lIA0KICAgIG11dGF0ZSh1bmlkYWQgPSAidXNkL20zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUgIA0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsIHRvdGFsX3RpcG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC1jKEJSRU5ULCBXVEkpKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gInRpcG9fY3J1ZG8iLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgNTpuY29sKC4pKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8gPSBtZWFuKHRvdGFsX3RpcG9fY3J1ZG8pLA0KICAgICAgICAgICAgcHJlY2lvX3Byb21lZGlvX3RpcG9fY3J1ZG8gPSBtZWFuKHZhbG9yKSkgJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBpbnRlcm5vIikNCg0KIyBSZXZpc3RhIElERUUNCiMgcHJlY2lvcyBpbnRlcm5vcyB2cyBwcmVjaW8gcHJvbWVkaW8gaW50ZXJubyBkZSBlZXV1IHZzIHByZWNpbyBhcmFiYWkgc2F1ZGl0YS4gY3VhZHJvIDMuMS4zLjEgcC4xNzANCnByZWNpb19taV92c19pbnRlcm5hY2lvbmFsX2lkZWVfY3J1ZG8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA0KQ0KDQoNCiNtZXJnZQ0KcHJlY2lvX21pX2NydWRvIDwtIHByZWNpb19taV9yZWdhbGlhc19jcnVkbyAlPiUgIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8pICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV9tZWNvbl9jcnVkbyApICU+JSANCiAgZnVsbF9qb2luKHZ0YXNfcHJlY2lvX21lbW9feXBmX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICAgcHJlY2lvX21pX3lwZl9jcnVkbyApKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19taV9pZGVlX2NydWRvID0gcHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwgKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInVzZC9tMyIpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvIiwgDQogICAgICAgICAgICAgICAgICAgICAgInByZWNpb19taV9tZWNvbl9jcnVkbyIsICJwcmVjaW9fbWlfeXBmX2NydWRvIiwgInByZWNpb19taV9pZGVlX2NydWRvIiksIA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNiYmxfcCkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fbWlfbWVjb25fY2Nubl9jcnVkbyA9IHByZWNpb19jcnVkb19taV91c2RfYmJsICkpICU+JSANCiAgbGVmdF9qb2luKGlwaW1fYmFzZTk0ICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGlwaW1fbml2ZWxfZ3JhbF85NCksIGJ5ID0gImFuaW8iKSAlPiUgDQogIHJlbmFtZShyZWdhbGlhcyA9IHByZWNpb19taV9yZWdhbGlhc19jcnVkbywNCiAgICAgICAgIG1lY29uID0gcHJlY2lvX21pX21lY29uX2NydWRvLA0KICAgICAgICAgeXBmID0gcHJlY2lvX21pX3lwZl9jcnVkbywNCiAgICAgICAgIGlkZWUgPSBwcmVjaW9fbWlfaWRlZV9jcnVkbywNCiAgICAgICAgIG1lY29uX2Njbm4gPSBwcmVjaW9fbWlfbWVjb25fY2Nubl9jcnVkbykgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgdW5ncm91cCgpDQpwcmVjaW9fbWlfY3J1ZG8gPC0gIHByZWNpb19taV9jcnVkbyAlPiUgDQogIG11dGF0ZSggdW5pZGFkID0gInVzZC9iYXJyaWxlcyIsDQogICAgICAgICAgIHZhcmlhYmxlID0gICJQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIsDQogICAgICAgICAgbWVjb25fZXN0aW1hZG8gPSBwcmVjaW9fbWlfY3J1ZG8kbWVjb25bcHJlY2lvX21pX2NydWRvJGFuaW89PTE5OTRdKmlwaW1fbml2ZWxfZ3JhbF85NCwNCiAgICAgICAgICBpbmRpY2VfeXBmXzcyID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWUgPSB5cGYsIGZlY2hhID0gYW5pbywgZmVjaGFfYmFzZSA9IDE5NzIpLA0KICAgICAgICAgaWRlZV9lc3RpbWFkbyA9IHByZWNpb19taV9jcnVkbyRpZGVlW3ByZWNpb19taV9jcnVkbyRhbmlvPT0xOTcyXSAqIGluZGljZV95cGZfNzIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWRvaW50ID0gICBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5NjM6MTk2NSB+IGlkZWVfZXN0aW1hZG8sDQogICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5NjY6MTk4OCB+IGlkZWUsDQogICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5ODk6MTk5MSB+IHlwZiwNCiAgICAgICAgICAgICAgICBhbmlvID09IDE5OTIgfiBtZWNvbl9lc3RpbWFkbywNCiAgICAgICAgICAgICAgICBhbmlvID4xOTkyIH4gbWVjb24pKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHZhcmlhYmxlLCBwcmVjaW9fY3J1ZG9fbWRvaW50ICwgZXZlcnl0aGluZyguKSwgDQogICAgICAgICAtYyhpcGltX25pdmVsX2dyYWxfOTQsIGlkZWVfZXN0aW1hZG8sbWVjb25fZXN0aW1hZG8saW5kaWNlX3lwZl83MixpZGVlX2VzdGltYWRvICkpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQogIA0KICANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfY3J1ZG8sIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fbWlfY3J1ZG8ueGxzeCIpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwgKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQoLiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBhbmlvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwpICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh2YXJpYWJsZSA9ICJwcmVjaW9fY3J1ZG9fbmV1cXVpbmFfdGNfb2ZpY2lhbCBlbiB1c2QvbTMiKSAlPiUNCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh2YXJpYWJsZSwgZXZlcnl0aGluZyguKSksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvLnhsc3giKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgMy4gUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbyBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByZWNpb19taV9jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX2NydWRvX21kb2ludCkNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdGx5KHByZWNpb19taV9jcnVkbyAlPiUgDQogICAgICBzZWxlY3QoLXByZWNpb19jcnVkb19tZG9pbnQpICU+JSANCiAgICAgIG11dGF0ZShyZWdhbGlhcyA9IA0KICAgICAgICAgICAgICAgY2FzZV93aGVuKHJlZ2FsaWFzID09IDAgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHJlZ2FsaWFzKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsIHZhbHVlID0gdmFsb3IsIDQ6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHZhcmlhYmxlLCBzaGFwZSA9IHZhcmlhYmxlKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuOCkrDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gMy4gUHJlY2lvcyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8uDQogICAgICAgQXJnZW50aW5hICgxOTYzIC0gMjAyMCkiLA0KICAgICAgIHkgPSAidXNkL2JhcnJpbCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQogICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQoNCiMjIyMgUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBHYXMgTmF0dXJhbA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIGdhczoNCiAgKyAxOTYzIC0gMTk2OSAmIDE5ODkgLSAxOTkyOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NzAgLSAxOTg4OiAgS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBCYXNlIFJlZ2Fsw61hcw0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQW51YXJpbyBZUEYNCnZ0YXNfcHJlY2lvX21lbW9feXBmX2dhcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lbW9yaWEgWVBGL3Z0YXNfdmFsb3JfY2FudGlkYWRfcHJlY2lvX2dhcy54bHN4IikgJT4lIA0KICAgIHJlbmFtZShjYW50X3ZlbmRpZGFkID0gIm0zIiwgdmFsb3JfdmVuZGlkbyA9ICIkIiwgbW9uZWRhID0gIk1vbmVkYSIpICU+JSANCiAgbGVmdF9qb2luKHZ0YXNfcHJlY2lvX21lbW9feXBmX2NydWRvICU+JSBzZWxlY3QoYW5pbywgbW9uZWRhLCB0Y2NfZGljICkpICU+JSANCiAgbXV0YXRlKHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCA9ICh2YWxvcl92ZW5kaWRvL2NhbnRfdmVuZGlkYWQpIC8gMTAwMCwNCiAgICAgICAgIHByZWNpb19taV91c2RfeXBmX2dhcyA9IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCAvIHRjY19kaWMsDQogICAgICAgICBwcmVjaW9fbWlfeXBmX2dhcyA9IGNhc2Vfd2hlbiggI2hvbW9nZW5pemFtb3MgbG9zIGNhbWJpb3MgZGUgbW9uZWRhDQogICAgICAgICAgIG1vbmVkYSA9PSAibSRuIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYG0kbmAgLA0KICAgICAgICAgICBtb25lZGEgPT0gIiRsZXkiIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsL2NvbnZlcnNvcl9wZXNvcyRgJExleWAsIA0KICAgICAgICAgICBtb25lZGEgPT0gIiRhcmciIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsL2NvbnZlcnNvcl9wZXNvcyRgJGFgLCANCiAgICAgICAgICAgbW9uZWRhID09ICJBIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkQSwNCiAgICAgICAgICAgVCB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCksDQogICAgICAgICBtb25lZGEgPSAiYXJzIiwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgI2FjbGFyYW1vcyBsYSB1bmlkYWQgbW9uZXRhcmlhIHlhIHRyYW5zZm9ybWFkYQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBtb25lZGEsIHZhbG9yX3ZlbmRpZG8sIGNhbnRfdmVuZGlkYWQsIA0KICAgICAgICAgcHJlY2lvX21pX3lwZl9nYXMscHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsLCB0Y2NfZGljLCBwcmVjaW9fbWlfdXNkX3lwZl9nYXMpDQoNCiNBbnVhcmlvIENvbWJ1c3RpYmxlDQphbnVhcmlvX2RlX2NvbWJ1c3RpYmxlIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvQW51YXJpbyBDb21idXN0aWJsZXMvYW51YXJpbyBkZSBjb21idXN0aWJsZS54bHN4IikgJT4lIA0KICBmaWx0ZXIobWVyY2FuY2lhID09ICJnYXNfbmF0dXJhbCIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyAsICAgICBtZXMsICAgICAgdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX21pX2FudWFyaW9fZ2FzID0gbWVhbih2YWxvcikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyAsICAgICAgIHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IG1lYW4ocHJlY2lvX21pX2FudWFyaW9fZ2FzKSkgJT4lIA0KICBtdXRhdGUocHJlY2lvX21pX2FudWFyaW9fZ2FzID0gKHByZWNpb19taV9hbnVhcmlvX2dhcy9jb252ZXJzb3JfcGVzb3MkQSkvMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQojIEJhc2UgTUVDT04NCnByZWNpb3NfaW50ZXJub3NfbWVjb25fZ2FzIDwtIGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiAlPiUgDQogIGZpbHRlcihpbmRpY2Fkb3IgPT0gbGlzdGFfZmlsdHJvWzJdLCANCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIkdhcyBuYXR1cmFsIiwNCiAgICAgICAgIGFsY2FuY2VfdGlwbyA9PSAiUEFJUyIpICU+JQ0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9tZWNvbl9nYXMgPSBtZWFuKHZhbG9yKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpDQoNCg0KIyMgQmFzZSByZWdhbGlhcw0KI3ZhbG9yZXMgOTMgLSA5OA0KcHJlY2lvX3JlZ2FsaWFzX3RvdGFsX2dhcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvcHJlY2lvX21pX2dhcy54bHN4IiwNCiAgICBzaGVldCA9ICJqayIpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAxOTk5KSAlPiUgDQogIG11dGF0ZShwcmVjaW9fdG90YWxfZ2FzID0gcHJlY2lvX21pX2dhcyAqIDEwMDAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lIA0KICBzZWxlY3QoLXByZWNpb19taV9nYXMpDQoNCiN2YWxvcmVzIHBvc3QgOTkNCnByZWNpb19yZWdhbGlhc19taV9nYXMgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19pbnRlcm5vX2dhc19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JQ0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfY3VlbmNhID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiLA0KICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCAgZXZlcnl0aGluZyguKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJjdWVuY2EiLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGdzdWIoIiwiLCAiIiwgdmFsb3IpLA0KICAgICAgICAgdmFsb3IgPSBhcy5kb3VibGUodmFsb3IpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCwgY3VlbmNhKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fcHJvbWVkaW9fY3VlbmNhID0gbWVhbih2YWxvcikpJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBpbnRlcm5vIikgJT4lIA0KICBmaWx0ZXIoY3VlbmNhID09ICJ0b3RhbF9jdWVuY2EiKSU+JSAgI3F1aXRvIHByZWNpbyBwcm9tZWRpbyBlbGFib3JhZG8gcHEgbm8gc2UgdXNhcsOhDQogIGxlZnRfam9pbihwcmVjaW9fcmVnYWxpYXNfdG90YWxfZ2FzKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTk5IH4gcHJlY2lvX3RvdGFsX2dhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHByZWNpb19wcm9tZWRpb19jdWVuY2EpKSAlPiUgDQogIHNlbGVjdCgtYyhwcmVjaW9fdG90YWxfZ2FzLCBwcmVjaW9fcHJvbWVkaW9fY3VlbmNhKSkNCg0KI1JldmlzdGEgSURFRQ0KI3ByZWNpbyB0cmFuc2ZlcmVuY2lhLCByZWdhbGlhcywgY29tcGVuc2FjaW9uZXMsIGV0YyBwcm9tZWRpbyBhbnVhbA0KcHJlY2lvX21pX2lkZWVfZ2FzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fdHJhbnNmZXJlbmNpYSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzcwKSkgJT4lDQogIG11dGF0ZShwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MgPSBwcmVjaW9fdHJhbnNmZXJlbmNpYSAqIGlwY183MCAvIGNvbnZlcnNvcl9wZXNvcyRgJExleWApICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSApICU+JSANCiAgbXV0YXRlKHByZWNpb19taV9pbmRleGFkb191c2QgPSBwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MvdGNjICkgIA0KICAjIHNlbGVjdCgtYyh1bmlkYWQsIHByZWNpb190cmFuc2ZlcmVuY2lhKSkNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV9pZGVlX2dhcywgcGF0aCA9ICJwcmVjaW9fbWlfaWRlZV9nYXMueGxzeCIpDQoNCiNjb252ZXJzb3IgZGUgbW9uZWRhIA0KIyAlPiUgDQojICAgbXV0YXRlKHByZWNpb190cmFuc2ZlcmVuY2lhID0gY2FzZV93aGVuKA0KIyAgICAgYW5pbyA8IDE5ODMgfiBwcmVjaW9fdHJhbnNmZXJlbmNpYS9jb252ZXJzb3JfcGVzb3MkYCRMZXlgLA0KIyAgICAgYW5pbyA9PSAxOTgzIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEgLyBjb252ZXJzb3JfcGVzb3MkYCRhYCwNCiMgICAgIGFuaW8gJWluJSAxOTgzOjE5OTEgfiBwcmVjaW9fdHJhbnNmZXJlbmNpYS9jb252ZXJzb3JfcGVzb3MkQSkpDQoNCiNNZXJnZQ0KcHJlY2lvX21pX2dhcyA8LSBwcmVjaW9fcmVnYWxpYXNfbWlfZ2FzICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21pX3JlZ2FsaWFzX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19pbnRlcm5vc19tZWNvbl9nYXMpICU+JSANCiAgZnVsbF9qb2luKHZ0YXNfcHJlY2lvX21lbW9feXBmX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsICBwcmVjaW9fbWlfeXBmX2dhcyApKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfaWRlZV9nYXMgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8gPSBwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVjaW9fbWlfaWRlZV9jdGVzX3Blc29zID0gcHJlY2lvX3RyYW5zZmVyZW5jaWEpKSAlPiUgDQogIGxlZnRfam9pbihhbnVhcmlvX2RlX2NvbWJ1c3RpYmxlKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBwcmVjaW9fbWlfbWVjb25fY2Nubl9nYXMgPSBwcmVjaW9fZ2FzX21pX3Blc29zX01tMykpICU+JSANCiAgIyBtdXRhdGUocHJlY2lvX2dhc19tZG9pbnQgPSBjYXNlX3doZW4oYW5pbyA8IDE5ODggfiBwcmVjaW9fbWlfeXBmX2dhcywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODggfiAgcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5ODk6MTk5MSAgfiBwcmVjaW9fbWlfeXBmX2dhcywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5OTIgIH4gcHJlY2lvX21pX3lwZl9nYXMvMTAsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTIgfiBwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzKSwNCiAgIyAgICAgICAgZGlmX3lwZl9pZGVlID0gcHJlY2lvX21pX3lwZl9nYXMvcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8tMSApICU+JQ0KICBtdXRhdGUodmFyaWFibGUgPSAiUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIsDQogICAgICAgICBwcmVjaW9fZ2FzX21kb2ludCA9IGNhc2Vfd2hlbihhbmlvICVpbiUgMTk2MzoxOTY5fGFuaW8gJWluJSAxOTg5OjE5OTEgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19taV95cGZfZ2FzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5NzA6MTk4OCB+IHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5OTIgIH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcykgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsdmFyaWFibGUsIHByZWNpb19nYXNfbWRvaW50LCBldmVyeXRoaW5nKC4pICkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzLA0KICAgICAgICAgbWVjb24gPSBwcmVjaW9fbWlfbWVjb25fZ2FzLA0KICAgICAgICAgeXBmID0gcHJlY2lvX21pX3lwZl9nYXMsDQogICAgICAgICBpZGVlID0gcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8sDQogICAgICAgICBtZWNvbl9jY25uID0gcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzLA0KICAgICAgICAgYW51YXJpbyA9IHByZWNpb19taV9hbnVhcmlvX2dhcykgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCiNwcmVjaW8gaW50ZXJubyBlbiBNTUJUVSBwZXNvcw0KcHJlY2lvX21pX2dhc19NTUJUVSA8LSAgcHJlY2lvX21pX2dhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc2VsZWN0KC1jKHVuaWRhZCwgdmFyaWFibGUpKSAlPiUgDQogIG11dGF0ZV9hbGwoIGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9wKHgvMTAwMCl9KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01NQlRVIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KDQojcHJlY2lvIGludGVybm8gZW4gTU1CVFUgdXNkDQpwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkIDwtIHByZWNpb19taV9nYXNfTU1CVFUgJT4lDQogICMgc2VsZWN0KC1kaWZfeXBmX2lkZWUpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yLyB0Y2MsDQogICAgICAgICB1bmlkYWQgPSAidXNkL01NQlRVIikgJT4lIA0KICBzZWxlY3QoLWModGNjLHRjcCwgc29icmV2YWx1YWNpb24pKSAlPiUgDQogIHNwcmVhZChrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpDQoNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV9nYXMsIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fbWlfZ2FzLnhsc3giKQ0KDQojcHJlY2lvIHJldmlzdGEgdHJhbnNwdWVzdG8NCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfaWRlZV9nYXMgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcmVjaW9fdHJhbnNmZXJlbmNpYV95cGZfYV9HRSA9cHJlY2lvX3RyYW5zZmVyZW5jaWEgKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQoLiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBhbmlvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UpICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh2YXJpYWJsZSA9ICJwcmVjaW9fdHJhbnNmZXJlbmNpYV95cGZfYV9HRSBlbiBwZXNvcyBkZSAxOTcwLzEwMDAgbTMiKSAlPiUNCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh2YXJpYWJsZSwgZXZlcnl0aGluZyguKSksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJwcmVjaW9fbWlfaWRlZV9nYXMueGxzeCIpDQoNCiMgZ3JhZl9taV9nYXMgPC0gcHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiMgICBzZWxlY3QoYW5pbywgcHJlY2lvX21pX2luZGV4YWRvX3Blc29zLCBwcmVjaW9fbWlfaW5kZXhhZG9fdXNkKSAlPiUgDQojICAgZ2F0aGVyKC4sDQojICAgICAgICAgIGtleSA9IHZhcmlhYmxlICwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjozKSAlPiUNCiMgICBmaWx0ZXIodmFyaWFibGUgPT0icHJlY2lvX21pX2luZGV4YWRvX3VzZCIgKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB2YXJpYWJsZSkpKw0KIyAgIGdlb21fbGluZSgpDQojIGdyYWZfbWlfZ2FzDQoNCiMgcHJlY2lvX21pX2dhcyAlPiUgDQojICAgZmlsdGVyKGFuaW8gPiAyMDAwKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHByZWNpb19nYXNfbWRvaW50LCBwcmVjaW9fbWlfbWVjb25fY2Nubl9nYXMpDQpgYGANCg0KPGJyPg0KKipUYWJsYSA0LiBQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwgZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoYmFycmlsZXMpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcmVjaW9fbWlfZ2FzICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fZ2FzX21kb2ludCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3ByZWNpb19pbnRlcm5vX2dhc19tbWJ0dSA8LSBwcmVjaW9fbWlfZ2FzX01NQlRVICU+JQ0KICAjIHNlbGVjdCgtYyhkaWZfeXBmX2lkZWUsIHByZWNpb19nYXNfbWRvaW50KSkgJT4lIA0KICBzZWxlY3QoLWMoIHByZWNpb19nYXNfbWRvaW50KSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IvIHRjYykgJT4lDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIE7CsDQuIFByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbC4NCiAgICAgICBBcmdlbnRpbmEgKDE5NjMgLSAyMDE4KSIsIA0KICAgICAgIHkgPSAidXNkL01NQlRVIikNCmdncGxvdGx5KGdyYWZfcHJlY2lvX2ludGVybm9fZ2FzX21tYnR1LCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KYGBgDQoNCg0KIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBNZXJjYWRvIE11bmRpYWwNClByZWNpb3MgZGUgZXhwb3J0YWNpw7NuIGRlc2RlIEFyZ2VudGluYSwgYmVuY2htYXJrcyB5IFByZWNpb3MgZGVsIG1lcmNhZG8gZGUgRUVVVSAoc29sbyBnYXMsIGludGVybm9zIHkgZGUgZXhwby9pbXBvKQ0KDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYS1SZWdhbGlhc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3JlZ2FsaWFzLWRlLXBldHJvbGVvLWNydWRvLWdhcy1uYXR1cmFsLWdscC1nYXNvbGluYS15LWNvbmRlbnNhZG8pKSAoMjAwNi1ob3kpDQoqIFtNRUNPTl0oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3ByZWNpby1kZS1leHBvcnRhY2lvbi1kZS1wZXRyb2xlby1jcnVkbykuIFNlcmllIGNvcnRhIHkgc2luIHRyYW5zZm9ybWFjaW9uZXMNCiogRUlBDQogICsgW0JyZW50XShodHRwczovL3d3dy5laWEuZ292L2RuYXYvcGV0L2hpc3QvUkJSVEVELmh0bSkgKDE5ODctaG95KQ0KICArIFtXVEldKGh0dHBzOi8vd3d3LmVpYS5nb3YvZG5hdi9wZXQvaGlzdC9yd3RjRC5odG0pICgxOTg2LWhveSkNCiAgKyBbSGVucnkgSHViXShodHRwczovL3d3dy5laWEuZ292L2RuYXYvbmcvaGlzdC9ybmd3aGhkZC5odG0pICgxOTk3LWhveSkNCiAgKyBbUHJlY2lvIEdhcyBkZSBCb2NhIGRlIFBvem8gZW4gRUVVVV0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L25nL2hpc3QvbjkxOTB1czNBLmh0bSkNCiogW0luZmxhdGlvbiBEYXRhXShodHRwczovL2luZmxhdGlvbmRhdGEuY29tL2FydGljbGVzL2luZmxhdGlvbi1hZGp1c3RlZC1wcmljZXMvaGlzdG9yaWNhbC1jcnVkZS1vaWwtcHJpY2VzLXRhYmxlLykgKDE5NDYtaG95KQ0KKiBbRXVyb3N0YXRdKGh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0L3dlYi9lbmVyZ3kvZGF0YS9kYXRhYmFzZSkNCiogUmV2aXN0YSBJREVFICAgDQogICsgUHJlY2lvIGRlIEltcG9ydGFjacOzbiBkZSBnYXMgbmF0dXJhbCBkZXNkZSBCb2xpdmlhICgxOTcwLTE5ODgpDQoqIFtVTiBDb210cmFkZV0oaHR0cHM6Ly9jb210cmFkZS51bi5vcmcvZGF0YS8pDQogICsgUHJlY2lvIGRlIEV4cG9ydGFjacOzbiBlIEltcG9ydGFjacOzbiBkZSBnYXMgeSBjcnVkbyAoYSBCb2xpdmlhIHkgcHJvbWVkaW8gbXVuZGlhbCkNCiAgKyBFbCBwcmVjaW8gaW1wbyBib2xpdmlhIGRlICBVTiBDb210cmFkZSBjaWVycmEsIGRhIHZhbG9yZXMgY29oZXJlbnRlcyBwZXJvIG5vIGRlYmVyaWEsIGRhZG8gcXVlIGxhIGNvbnZlcnNpw7NuIGRlYmVyaWEgcmVhbGl6YXJzZSBtdWx0aXBsaWNhbmRvIGVsIHByZWNpbyBlbiBNbTMgcG9yIDEwMDAgeSBhaMOtIHJlY2nDqW4gcmVhbGl6YXIgbGEgY29udmVyc2nDs24NCiAgDQoNCiMjIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBDcnVkbw0KKiBGdWVudGVzIHNlbGVjY2lvbmFkYXMgcGFyYSBwcmVjaW9fbWVfY3J1ZG86IA0KICArIGVudHJlIDE5NjIgeSAxOTkyOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoY2xhc2lmaWNhY2nDs24gU0lUQyBhcyByZXBvcnRlZCkNCiAgKyBlbnRyZSAxOTkzLTIwMDEgeSAyMDA0LTIwMTQ6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIE1lY29uDQogICsgZW50cmUgMjAwMiB5IDIwMDM6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gZGUgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlIChDbGFzaWZpY2FjacOzbiBIUyBhcyByZXBvcnRlZCkNCiAgKyAyMDE0IGVuIGFkZWxhbnRlOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoUmVnYWzDrWFzKQ0KICArIFZhbG9yZXMgZmFsdGFudGVzIHByZXZpb3MgYSAxOTkyICgxOTcwIC0gMTk4NSk6IEJyZW50IChGdWVudGU6IEluZmxhdGlvbiBEYXRhKQ0KDQoNCioqRmFsdGEgY29uc3RydWlyIHVuYSBwYXJpZGFkIGRlIGV4cG8vaW1wbyBjb24gZWwgZmxldGUqKg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0Jhc2UgcmVnYWxpYXMNCnByZWNpb19tZV9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2V4dGVybm9fY3J1ZG9fcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX3RpcG9fY3J1ZG8gPSAiVE9UQUwgVElQTyBERSBDUlVETyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJ1c2QvbTMiLA0KICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JQ0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsIHRvdGFsX3RpcG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC1jKEJSRU5ULCBXVEkpKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gInRpcG9fY3J1ZG8iLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgNTpuY29sKC4pKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIHN1bW1hcmlzZShwcmVjaW9fdG90YWxfdGlwb19jcnVkbyA9IG1lYW4odG90YWxfdGlwb19jcnVkbykpICU+JSANCiAgICAgICAgICAgICMgcHJlY2lvX3Byb21lZGlvX3RpcG9fY3J1ZG8gPSBtZWFuKHZhbG9yKSklPiUgDQogIG11dGF0ZSh0aXBvX3ByZWNpbyA9ICJtZXJjYWRvIGV4dGVybm8iLA0KICAgICAgICAgcHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcChwcmVjaW9fdG90YWxfdGlwb19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAidXNkL2JhcnJpbGVzIikNCg0KIyBNZWNvbiBNT0RJRklDQVIgDQpwcmVjaW9fZXhwb3J0YWNpb25fY3J1ZG8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9wcmVjaW8tZXhwb3J0YWNpb24tY3J1ZG8ueGxzeCIsIA0KICAgIHNraXAgPSAyKQ0KDQojSU5ERUMgQ29tRXgNCnByZWNpb19leHBvX2luZGVjIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9JTkRFQy9Db21FeC9wcmVjaW9fYW51YWxfcHJvbWVkaW9fZXhwb19oaWRyb19pbmRlYy5jc3YiLCAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIHNlbGVjdCgtVENQKSkgICU+JSANCiAgbXV0YXRlKCBwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSAocHJlY2lvX2V4cG9fZ2FzX2luZGVjKSAqIFRDQywNCiAgICAgICAgICAgICAgICAgICAgICB1bmlkYWRfZ2FzID0gImFycy9NaWxlcyBkZSBtMyIJKQ0KICAjIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSBwcmVjaW9fZXhwb19nYXNfaW5kZWMgKiBUQ0MsIA0KICAjICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJ1c2QvTWlsZXMgZGUgbTMiIH4gImFycy9NaWxlcyBkZSBtMyIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSkNCg0KI1VOIENPTVRSQURFDQpleHBvX2NydWRvX3VuY29tdHJhZGVfaHMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL2V4cG9fY3J1ZG9fdW5jb210cmFkZV9ocy5jc3YiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfcHJlY2lvID0gInVzZC9iYXJyaWxlcyIsDQogICAgICAgICB1bmlkYWRfdmFsb3IgPSAidXNkIiwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICJiYXJyaWxlcyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QsDQogICAgICAgICBwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbyA9IGV4cG9fcHJlY2lvX2JibCwgDQogICAgICAgICBleHBvX3VzZF9jb210cmFkZV9jcnVkbyA9ICJUcmFkZSBWYWx1ZSAoVVMkKSIpDQoNCmV4cG9fY3J1ZG9fc2l0YyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvZXhwb19jcnVkb19zaXRjLmNzdiIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9wcmVjaW8gPSAidXNkL2JhcnJpbGVzIiwNCiAgICAgICAgIHVuaWRhZF92YWxvciA9ICJ1c2QiLA0KICAgICAgICAgdW5pZGFkX2NhbnRpZGFkID0gImJhcnJpbGVzIikgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCwNCiAgICAgICAgIHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8gPSBleHBvX3ByZWNpb19iYmwsIA0KICAgICAgICAgZXhwb191c2RfY29tdHJhZGVfY3J1ZG8gPSAiVHJhZGUgVmFsdWUgKFVTJCkiKQ0KDQojTWVyZ2UgYmFzZXMNCnByZWNpb19leHBvX2NydWRvIDwtIHByZWNpb19tZV9yZWdhbGlhc19jcnVkbyAlPiUgDQogIHJlbmFtZShwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbyA9IHByZWNpb190b3RhbF90aXBvX2NydWRvKSAlPiUgDQogIHNlbGVjdCgtdGlwb19wcmVjaW8pICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX2V4cG9fbWVjb25fY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbWVfdXNkX2JibCApKSAlPiUNCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1jKHByZWNpb19leHBvX2dhc19pbmRlYywgdW5pZGFkX2dhcykpKSAlPiUNCiAgbGVmdF9qb2luKGV4cG9fY3J1ZG9fdW5jb210cmFkZV9ocyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLCBwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fY3J1ZG9fc2l0YyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLCBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSkgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICAjIG11dGF0ZShwcmVjaW9fZXhwb19jcnVkbyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvICVpbiUgMTk5MzoyMDE0IH4gcHJlY2lvX2V4cG9fbWVjb25fY3J1ZG8sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMjAxNCB+IHByZWNpb19leHBvX3JlZ2FsaWFzX2NydWRvKSkgJT4lIA0KICAjIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtVENDKQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pLCAtVENDKQ0KIyBwcmVjaW9fZXhwb19jcnVkbw0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUHJlY2lvIFJlZmVyZW5jaWEgTWVyY2FkbyBFeHRlcm5vIENydWRvDQojQnJlbnQNCmJyZW50X2EgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL2JyZW50Lnhsc3giLCANCiAgICBza2lwID0gNCklPiUgIA0KICByZW5hbWUoYW5pbyA9IFllYXIsIGJyZW50X25vbWluYWwgPSBgTm9taW5hbCBQcmljZWAsIGJyZW50X2FkanVzdGVkID0gYEluZmxhdGlvbiBBZGp1c3RlZCBQcmljZWApICAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkL2JhcnJpbGVzIiwNCiAgICAgICAgIGFuaW8gPSBhcy5kb3VibGUoYW5pbykpIA0KDQoNCmJyZW50X2RhaWx5ICA8LSAgcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL1JCUlRFZC54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lDQogIHJlbmFtZShmZWNoYSA9IERhdGUsIGJyZW50X3Nwb3QgPSBgRXVyb3BlIEJyZW50IFNwb3QgUHJpY2UgRk9CIChEb2xsYXJzIHBlciBCYXJyZWwpYCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInVzZC9iYXJyaWxlcyIsDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUoZmVjaGEpLCANCiAgICAgICAgIGFuaW8gPSB5ZWFyKGZlY2hhKSkgDQoNCmJyZW50X0lFQSAgPC0gIGJyZW50X2RhaWx5ICU+JSANCiAgZ3JvdXBfYnkodW5pZGFkLCBhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShicmVudF9zcG90ID0gbWVhbihicmVudF9zcG90KSkNCg0KYnJlbnQgPC0gYnJlbnRfYSAlPiUNCiAgc2VsZWN0KC1icmVudF9hZGp1c3RlZCkgJT4lIA0KICBsZWZ0X2pvaW4oYnJlbnRfSUVBKSAlPiUgDQogIG11dGF0ZShkaWYgPSBicmVudF9zcG90L2JyZW50X25vbWluYWwgLSAxKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgcmVuYW1lKGJyZW50X2llYSA9IGJyZW50X3Nwb3QsDQogICAgICAgICBicmVudF9oaXN0b3JpYyA9IGJyZW50X25vbWluYWwpDQoNCiNXVEkgDQp3dGlfRUlBX2RhaWx5IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL1JXVENkLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSh3dGlfZWlhID0gYEN1c2hpbmcsIE9LIFdUSSBTcG90IFByaWNlIEZPQiAoRG9sbGFycyBwZXIgQmFycmVsKWAgKSAlPiUgDQogIG11dGF0ZShtZXMgPSBtb250aChEYXRlKSwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKERhdGUpLA0KICAgICAgICAgdW5pZGFkID0gInVzZC9iYXJyaWxlcyIpDQoNCnd0aV9FSUEgPC0gd3RpX0VJQV9kYWlseSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2Uod3RpX2VpYSA9IG1lYW4od3RpX2VpYSwgbmEucm0gPSBUKSkNCg0Kd3RpX2ZyZWQgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0ZSRUQvV1RJU1BMQy5jc3YiKSAgJT4lDQogIHJlbmFtZSh3dGlfc3BvdF9wcmljZSA9IFdUSVNQTEMpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKERBVEUpLA0KICAgICAgICAgdW5pZGFkID0gInVzZC9iYXJyaWxlcyIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZSh3dGlfc3BvdF9wcmljZV9mcmVkID0gbWVhbih3dGlfc3BvdF9wcmljZSkpDQogIA0Kd3RpX3JldGVuY2lvbl8wNCA8LSB3dGlfRUlBX2RhaWx5ICAlPiUgDQogIGZpbHRlcihhbmlvID4gMjAwMyApICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgbWVzKSAlPiUgDQogIHN1bW1hcmlzZSh3dGkgPSBtZWFuKHd0aV9laWEpKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb24gPSBjYXNlX3doZW4od3RpIDwgMzIgfiAwLjI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzMiAmIHd0aSA8IDM0Ljk5IH4gMC4yOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzUgJiB3dGkgPCAzNi45OSB+IDAuMzEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDM3ICYgd3RpIDwgMzguOTkgfiAwLjM0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzOSAmIHd0aSA8IDQwLjk5IH4gMC4zNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gNDEgJiB3dGkgPCA0Mi45OSB+IDAuNDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDQzICYgd3RpIDwgNDQuOTkgfiAwLjQzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSA0NSB+IDAuNDUpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHJldGVuY2lvbiA9IG1lYW4ocmV0ZW5jaW9uKSkNCg0KDQp3dGlfcmV0ZW5jaW9uXzA3IDwtIHd0aV9FSUFfZGFpbHkgJT4lIA0KICBmaWx0ZXIoYW5pbyAlaW4lIGMoIDIwMDc6MjAxNCksIERhdGUgPiAiMjAwNy0xMS0wMiIgKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb24gPSBjYXNlX3doZW4od3RpX2VpYSA+PSA2MC45IH4gKHd0aV9laWEgLSA0MikvNDIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aV9laWEgPCA2MC45IH4gMC40NSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2Uod3RpX2VpYSA9IG1lYW4od3RpX2VpYSksDQogICAgICAgICAgICByZXRlbmNpb24gPSAgbWVhbihyZXRlbmNpb24pKQ0KDQpicmVudF9yZW50ZW5jaW9uXzE0IDwtICBicmVudF9kYWlseSAlPiUNCiAgIGZpbHRlcihhbmlvICVpbiUgYyggMjAxNDoyMDE1KSwgZmVjaGEgPiAiMjAwNy0xMS0wMiIgKSAlPiUNCiAgbXV0YXRlKHJldGVuY2lvbiA9IGNhc2Vfd2hlbihicmVudF9zcG90ID49IDcxIH4gKGJyZW50X3Nwb3QgLSA3MCkvNzAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlbnRfc3BvdCA8IDcxIH4gMC4wMSkpICU+JSANCiAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGJyZW50X3Nwb3QgPSBtZWFuKGJyZW50X3Nwb3QpLA0KICAgICAgICAgICAgcmV0ZW5jaW9uID0gIG1lYW4ocmV0ZW5jaW9uKSkNCiAgDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1ByZWNpbyBkZSBleHBvcnRhY2lvbiB5IHJlZmVyZW5jaWEuIE1lcmdlIGRlIGJhc2VzDQpwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvIDwtICBwcmVjaW9fZXhwb19jcnVkbyAgJT4lICAgDQogIGZ1bGxfam9pbihicmVudCAlPiUgc2VsZWN0KC1kaWYpKSAlPiUgDQogIGxlZnRfam9pbih3dGlfRUlBICkgJT4lIA0KICBmdWxsX2pvaW4od3RpX2ZyZWQpICU+JSANCiAgbXV0YXRlKHByZWNpb19leHBvX2NydWRvX2luZGVjID0gY2FzZV93aGVuKHByZWNpb19leHBvX2NydWRvX2luZGVjID4gMzAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMpLA0KICAgICAgICAgcHJlY2lvX21lX2NydWRvID0gY2FzZV93aGVuKGFuaW8gJWluJSAxOTkzOjIwMDEgfCBhbmlvICVpbiUgMjAwNDoyMDE0IH4gcHJlY2lvX2V4cG9fbWVjb25fY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDIwMDI6MjAwMyB+IHByZWNpb19leHBvX2NvbXRyYWRlX2hzX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAyMDE0IH4gcHJlY2lvX2V4cG9fcmVnYWxpYXNfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEocHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykgfiBicmVudF9oaXN0b3JpYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvIDwgMTk5MyB+IHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19tZV9jcnVkbywgZXZlcnl0aGluZyguKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvcHJlY2lvX2V4cG9feV9tZG9fbXVuZGlhbF9jcnVkby54bHN4IikNCnByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByZWNpb19tZV9jcnVkbykNCg0KDQpncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9jcnVkbyA8LSBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fbWVfY3J1ZG8pICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogICMgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUiLCAicHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlIiwgInByZWNpb19leHBvX2dhc19pbmRlYyIpKSkgJT4lDQogICMgZmlsdGVyKGFuaW8gIT0gMjAwMiAmIHRpcG9fcHJlY2lvICE9ICJwcmVjaW9fZXhwb19jcnVkb19pbmRlYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID0gdGlwb19wcmVjaW8pKSsNCiAgZ2VvbV9saW5lKGFscGhhID0gMC45KSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJQcmVjaW9zIGRlIGV4cG9ydGFjacOzbiB5IHJlZmVyZW5jaWEgZGVsIG1lcmNhZG8gbXVuZGlhbCBkZWwgY3J1ZG8iLCANCiAgICAgICB5ID0gInVzZC9iYXJyaWxlcyIpDQoNCmdncGxvdGx5KGdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2NydWRvLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpgYGANCg0KIyMjIyBQcmVjaW9zIGRlIFJlZmVyZW5jaWEgZGVsIEdhcw0KDQoqIENyaXRlcmlvIGRlIHByZWNpb19leHRlcm5vX2dhczoNCiAgKyBBw7FvcyAxOTY0IHkgMTk2NTogUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBnYXMgcHJvdmVuaWVudGUgZGUgQm9saXZpYSBoYWNpYSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyAxOTY2IGVuIGFkZWxhbnRlOiBQcmVjaW8gZGUgZXhwb3J0YWNpb24gZGUgZ2FzIGRlc2RlIEJvbGl2aWEgYSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyBEYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgcHJldmlvcyBhIDE5NjMgeSBwZXLDrW9kbyAxOTY4LTE5NzENCg0KIyMjIyMgRXhwb3J0YWNpw7NuIEFyZ2VudGluYQ0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFByZWNpbyBkZSBFeHBvcnRhY2nDs24gZGVsIEdhcyANCiNyZWdhbGlhcw0KcHJlY2lvX2V4cG9fcmVnYWxpYXNfZ2FzIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJlY2lvX21lcmNhZG9fZXh0ZXJub19nYXNfcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsDQogICAgICAgICB0b3RhbF9jdWVuY2EgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiLA0KICAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsIHVuaWRhZCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJjdWVuY2EiLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCwgY3VlbmNhKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gZ3N1YigiLCIsICIiLCB2YWxvciksDQogICAgICAgICB2YWxvciA9IGFzLmRvdWJsZSh2YWxvcikpICU+JSAgDQogIHN1bW1hcmlzZShwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMgPSBtZWFuKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUgDQogIG11dGF0ZSh0aXBvX3ByZWNpbyA9ICJtZXJjYWRvIGV4dGVybm8iKSAlPiUNCiAgZmlsdGVyKGN1ZW5jYSA9PSAidG90YWxfY3VlbmNhIiklPiUNCiAgYXJyYW5nZShhbmlvKQ0KDQojY29tdHJhZGUNCmV4cG9fZ2FzX2NvbXRyYWRlIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9yZXN1bHRhZG9zL2V4cG9fZ2FzX3NpdGMuY3N2IikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUgDQogIG11dGF0ZShleHBvX3ByZWNpb19NTUJUVSA9IGNvbnZlcnNvcl9tM01NQlRVX3AoZXhwb19wcmVjaW9fTW0zICksDQogICAgICAgICBleHBvX3ByZWNpb19NbTNfYXJzID0gZXhwb19wcmVjaW9fTW0zICogdGNjKSANCg0KI21lcmdlIGRlIGJhc2VzDQojcHJlY2lvIGVuIHBlc29zDQpwcmVjaW9fZXhwb19nYXMgPC0gZXhwb19nYXNfY29tdHJhZGUgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlID0gZXhwb19wcmVjaW9fTW0zX2FycykgJT4lIA0KICBmdWxsX2pvaW4ocHJlY2lvX2V4cG9fcmVnYWxpYXNfZ2FzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1jKGN1ZW5jYSwgdGlwb19wcmVjaW8pKSkgJT4lDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19pbmRlYyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9nYXMsIHByZWNpb19leHBvX2dhc19pbmRlYykgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoIShpcy5uYShwcmVjaW9fZXhwb19nYXNfaW5kZWMpKSkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX2V4cG9fZ2FzX21lY29uID0gcHJlY2lvX2dhc19tZV9wZXNvc19NbTMpKQ0KDQoNCiNwcmVjaW9zIGVuIGRvbGFyZXMNCnByZWNpb19leHBvX2dhc191c2QgPC0gZXhwb19nYXNfY29tdHJhZGUgICU+JSAgDQogIHNlbGVjdChhbmlvLCAgcHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlID0gZXhwb19wcmVjaW9fTU1CVFUpICU+JQ0KICBsZWZ0X2pvaW4oIHByZWNpb19leHBvX2dhcyAlPiUgc2VsZWN0KC1jKHByZWNpb19leHBvX2dhc19jb210cmFkZSwgdW5pZGFkKSksIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIHNlbGVjdCgtVENQKSkgJT4lDQogIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMgPSAocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzLzEwMDApIC8gVENDLCANCiAgICAgICAgIHByZWNpb19leHBvX2dhc19pbmRlYyA9IChwcmVjaW9fZXhwb19nYXNfaW5kZWMgKS8gVENDLCANCiAgICAgICAgIHByZWNpb19leHBvX2dhc19tZWNvbiA9IChwcmVjaW9fZXhwb19nYXNfbWVjb24vMTAwMCkvIFRDQywNCiAgICAgICAgIHVuaWRhZCA9ICJ1c2QvTU1CVFUiKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19leHBvX2dhc19yZWdhbGlhcyIsICJwcmVjaW9fZXhwb19nYXNfaW5kZWMiLCAicHJlY2lvX2V4cG9fZ2FzX21lY29uIiksDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM01NQlRVX3ApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSwtVENDKQ0KDQoNCmBgYA0KDQojIyMjIyBSZWZlcmVuY2lhcyBtdW5kaWFsZXMNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBQcmVjaW8gUmVmZXJlbmNpYSBNZXJjYWRvIEV4dGVybm8gR2FzIA0KIyMjIyBQcmVjaW9zIE11bmRpYWxlcw0KI2hlbnJ5X2h1YiBFSUENCmhlbnJ5X2h1YiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvUk5HV0hIRGQueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKCBkYXRlID0gRGF0ZSwNCiAgICBoZW5yeV9odWJfc3BvdCA9IGBIZW5yeSBIdWIgTmF0dXJhbCBHYXMgU3BvdCBQcmljZSAoRG9sbGFycyBwZXIgTWlsbGlvbiBCdHUpYCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInVzZC9NTUJUVSIsDQogICAgICAgICBhbmlvID0geWVhcihkYXRlKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKGVpYV9oZW5yeV9odWJfc3BvdCA9IG1lYW4oaGVucnlfaHViX3Nwb3QsIG5hLnJtID0gVCkpIA0KDQpoZW5yeV9odWJfYXJzIDwtICBoZW5yeV9odWIgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIFRDQykpICU+JSANCiAgbXV0YXRlKGhlbnJ5X2h1Yl9zcG90ID0gY29udmVyc29yX01NQlRVbTNnYXNfcChlaWFfaGVucnlfaHViX3Nwb3QgKjEwMDAqVENDKSwNCiAgICAgICAgIHVuaWRhZD0gImFycy9NaWxlcyBkZSBtMyIpDQoNCiMgUHJlY2lvIFVTQSBib2NhIGRlIHBvem8gRUlBICAgICAgICAgIHVuaWRhZCA9ICJ1c2QvZnQzIg0Kd2VsbGhlYWRfcHJpY2VfZWV1dSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9uYXR1cmFsX2dhc193ZWxsaGVhZF9wcmljZV9lZXV1LnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSh1c193ZWxsaGVhZF9wcmljZV9mdDMgPSAiVS5TLiBOYXR1cmFsIEdhcyBXZWxsaGVhZCBQcmljZSAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldCkiKSAlPiUgIA0KICBtdXRhdGUoIHVzX3dlbGxoZWFkX3ByaWNlX01tMyA9IGNvbnZlcnNvcl9mdDNtM19wKHVzX3dlbGxoZWFkX3ByaWNlX2Z0MyoxMDAwKSwNCiAgICAgICAgICB1c193ZWxsaGVhZF9wcmljZV9NTUJUVSA9IGNvbnZlcnNvcl9mdDNNTUJUVV9wKHVzX3dlbGxoZWFkX3ByaWNlX2Z0My8xMDAwKSwNCiAgICAgICAgICBhbmlvID0geWVhcihEYXRlKSwNCiAgICAgICAgIHVuaWRhZCAgPSAidXNkIikgDQoNCiNvdHJvcyBwcmVjaW9zIGRlIFVTQSBFSUENCnByaWNlX2VldXUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvbmF0dXJhbF9nYXNfcHJpY2VzX3VzYS54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUodXNfd2VsbGhlYWRfZ2FzX3ByaWNlID0gYFUuUy4gTmF0dXJhbCBHYXMgV2VsbGhlYWQgUHJpY2UgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2ltcG9ydF9nYXNfcHJpY2UgPSBgUHJpY2Ugb2YgVS5TLiBOYXR1cmFsIEdhcyBJbXBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19waXBlbGluZV9pbXBvcnRfcHJpY2UgPSBgVS5TLiBOYXR1cmFsIEdhcyBQaXBlbGluZSBJbXBvcnRzIFByaWNlIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19sbmdfaW1wb3J0X3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgTE5HIEltcG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2V4cG9ydF9nYXNfcHJpY2UgPSBgUHJpY2Ugb2YgVS5TLiBOYXR1cmFsIEdhcyBFeHBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19leHBvcnRfZ2FzX3BpcGVsaW5lX3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgUGlwZWxpbmUgRXhwb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfZXhwb3J0X2xuZ19wcmljZSA9IGBQcmljZSBvZiBMaXF1ZWZpZWQgVS5TLiBOYXR1cmFsIEdhcyBFeHBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWApICU+JSANCiAgc2VsZWN0KHVzX3dlbGxoZWFkX2dhc19wcmljZSwgdXNfaW1wb3J0X2dhc19wcmljZSwgdXNfcGlwZWxpbmVfaW1wb3J0X3ByaWNlLA0KICAgICAgICB1c19sbmdfaW1wb3J0X3ByaWNlLCB1c19leHBvcnRfZ2FzX3ByaWNlLA0KICAgICAgICB1c19leHBvcnRfZ2FzX3BpcGVsaW5lX3ByaWNlLCB1c19leHBvcnRfbG5nX3ByaWNlICkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDE5MjI6MjAxOSkNCiAgDQoNCnByaWNlX2VldXVfTW0zIDwtICBwcmljZV9lZXV1ICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KXtjb252ZXJzb3JfZnQzbTNfcCggMTAwMCl9KSAlPiUgDQogIG11dGF0ZShhbmlvID0gMTkyMjoyMDE5LA0KICAgICAgICAgdW5pZGFkID0gInVzZC9NaWxlcyBkZSBtMyIpIA0KDQpwcmljZV9lZXV1X01NQlRVIDwtICBwcmljZV9lZXV1ICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KXtjb252ZXJzb3JfZnQzTU1CVFVfcCh4IC8xMDAwKX0pICU+JSANCiAgbXV0YXRlKGFuaW8gPSAxOTIyOjIwMTksDQogICAgICAgICB1bmlkYWQgPSAidXNkL01NQlRVIikgICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQoNCiNldXJvc3RhdA0KDQoNCiNCUA0KYnBfZ2FzX3ByaWNlcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9CUC9icC1zdGF0cy1yZXZpZXctMjAyMC1hbGwtZGF0YS54bHN4IiwgDQogICAgc2hlZXQgPSAiR2FzIC0gUHJpY2VzICIsIHNraXAgPSAzKSAlPiUgDQogIHJlbmFtZShhbmlvID0gLi4uMSwgDQogICAgICAgICBicF9sbmdfamFwYW5fY2lmID0gSmFwYW4sDQogICAgICAgICBicF9sbmdfamttID0gIkphcGFuIEtvcmVhIE1hcmtlciIsDQogICAgICAgICBicF9nYXNfZ2VybWFuX2ltcG9ydF9wcmljZSA9ICJBdmVyYWdlIEdlcm1hbiIsDQogICAgICAgICBicF9nYXNfbmJwID0gVUssDQogICAgICAgICBicF9nYXNfbmV0aGVybGFuZHNfdHRmID0gIk5ldGhlcmxhbmRzIFRURiIsDQogICAgICAgICBicF9nYXNfaGVucnlfaHViID0gVVMsDQogICAgICAgICBicF9nYXNfY2FuYWRhID0gQ2FuYWRhLCANCiAgICAgICAgIGJwX29pbF9taXhfbWVhbl9vZWNkID0gT0VDRCkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW8pKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkL01NQlRVIikNCg0KYnBfZ2FzXzIwMTYgPC0gYnBfZ2FzX3ByaWNlcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBicF9sbmdfamttLCBicF9nYXNfaGVucnlfaHViLCBicF9nYXNfbmV0aGVybGFuZHNfdHRmICkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoYW5pbyA9PSAyMDE2KQ0KDQoNCiNGTUkNCmZtaV9wcmljZXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0ZNSS9QQ1BTXzA5LTE2LTIwMjAgMTUtMDctMTAtNjZfdGltZVNlcmllcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgzOCA9IGNvbF9za2lwKCkpKQ0KDQpmbWlfZ2FzX3ByaWNlIDwtIGZtaV9wcmljZXMgJT4lIA0KICBmaWx0ZXIoYENvbW1vZGl0eSBOYW1lYCAlaW4lIGMoIk5hdHVyYWwgZ2FzLCBFVSIsIk5hdHVyYWwgR2FzLCBVUyBIZW5yeSBIdWIgR2FzIiwiTE5HLCBBc2lhIiAgKSwNCiAgICAgICAgIGBVbml0IE5hbWVgID09ICJJbmRleCIpICU+JSANCiAgcmVuYW1lKGNvbW1vZGl0eSA9ICJDb21tb2RpdHkgTmFtZSIsDQogICAgICAgICB1bmlkYWQgPSAiVW5pdCBOYW1lIikgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgICAgODpuY29sKC4pKSAlPiUgDQogIHNlbGVjdChjb21tb2RpdHksIGFuaW8sIHZhbG9yLCB1bmlkYWQgKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC8gMTAwLA0KICAgICAgICAgYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgJT4lIA0KICBzcHJlYWQoLiwNCiAgICAgICAgIGtleSA9IGNvbW1vZGl0eSwgDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIHJlbmFtZShmbWlfbG5nX2FzaWEgPSAiTE5HLCBBc2lhIiwNCiAgICAgICAgIGZtaV9uYXR1cmFsX2dhc19ldSA9Ik5hdHVyYWwgZ2FzLCBFVSIsDQogICAgICAgICBmbWlfaGVucnlfaHViID0gIk5hdHVyYWwgR2FzLCBVUyBIZW5yeSBIdWIgR2FzIikgJT4lIA0KICBtdXRhdGUoZm1pX2xuZ19hc2lhID0gZm1pX2xuZ19hc2lhICogYnBfZ2FzXzIwMTYkYnBfbG5nX2prbSwNCiAgICAgICAgIGZtaV9oZW5yeV9odWIgPSAgZm1pX2hlbnJ5X2h1YiAqIGJwX2dhc18yMDE2JGJwX2dhc19oZW5yeV9odWIsDQogICAgICAgICBmbWlfbmF0dXJhbF9nYXNfZXUgPSBmbWlfbmF0dXJhbF9nYXNfZXUgKiBicF9nYXNfMjAxNiRicF9nYXNfbmV0aGVybGFuZHNfdHRmLA0KICAgICAgICAgdW5pZGFkID0gInVzZC9NTUJUVSIpDQoNCg0KIyB1bmlxdWUoZm1pX3ByaWNlcyRgQ29tbW9kaXR5IE5hbWVgKQ0KIyB1bmlxdWUoZm1pX3ByaWNlcyRgVW5pdCBOYW1lYCkNCiMgdW5pcXVlKGZtaV9wcmljZXMkYENvdW50cnkgTmFtZWApDQpgYGANCg0KDQojIyMjIyBCb2xpdmlhDQogDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIyMjIFByZWNpbyBkZSBpbXBvcnRhY2nDs24gZGUgQm9saXZpYQ0KI1ByZWNpbyBpbXBvIGJvbGl2aWEgcmV2aXN0YSBJREVFDQpwcmVjaW9faWRlZV9pbXBvX2dhcyA8LSBjdWFkcm9fNC4zICAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfZ2FzLCBwcmVjaW9fZ2FzX2JvbGl2aWEpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY183MCkpICU+JQ0KICBtdXRhdGUocHJlY2lvX2dhc19ib2xpdmlhX2lkZWUgPSBwcmVjaW9fZ2FzX2JvbGl2aWEgKiBpcGNfNzAgLyBjb252ZXJzb3JfcGVzb3MkYCRMZXlgLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSkgJT4lIA0KICBtdXRhdGUocHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlID0gcHJlY2lvX2dhc19ib2xpdmlhX2lkZWUgL3RjYykNCg0KDQojcHJlY2lvIEJvbGl2aWEgWVBGQiBlbiB1c2QgKG9yaWdpbmFsKQ0KIyBhIG0zDQpwcmVjaW9fZXhwb19ib2xpdmlhX3VzZF95cGZiIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9wcmVjaW9fZXhwb19ib2xpdmlhLnhsc3giKSAlPiUNCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzIiwgInByZWNpb19leHBvX2JvbGl2aWFfYnpsX2dhcyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBmdW5jdGlvbih4KSB7Y29udmVyc29yX2Z0M20zX3AoeCl9KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkL01pbGVzIGRlIG0zIikNCg0KDQojIGEgTU0gQlRVDQpwcmVjaW9fZXhwb19ib2xpdmlhX3VzZF9NTUJUVV95cGZiIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9wcmVjaW9fZXhwb19ib2xpdmlhLnhsc3giKSAlPiUNCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzIiwgInByZWNpb19leHBvX2JvbGl2aWFfYnpsX2dhcyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBmdW5jdGlvbih4KSB7Y29udmVyc29yX2Z0M01NQlRVX3AoeC8xMDAwKX0pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJ1c2QvTU1CVFUiKSAlPiUgDQogIHJlbmFtZShwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ195cGZiID0gcHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzLA0KICAgICAgICAgcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfeXBmYiA9IHByZWNpb19leHBvX2JvbGl2aWFfYnpsX2dhcykgIA0KDQoNCiNwcmVjaW8gYm9saXZpYSBlbiBwZXNvcyANCiNzdW1hcmxlIGVsIGZsZXRlID0gMC4wMjQxMjk3OTQNCnByZWNpb19leHBvX2JvbGl2aWFfcGVzb3NfeXBmYiA8LSAgcHJlY2lvX2V4cG9fYm9saXZpYV91c2RfeXBmYiAlPiUgDQogICAgbGVmdF9qb2luKHRjcF9hbnVhbCkgJT4lDQogIG11dGF0ZShwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXNfcGVzb3MgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMgKiBUQ0MgLCANCiAgICAgICAgIHByZWNpb19leHBvX2JvbGl2aWFfYnpsX2dhc19wZXNvcyA9IHByZWNpb19leHBvX2JvbGl2aWFfYnpsX2dhcyAqIFRDQywNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQoNCiNwcmVjaW8gaW1wbyBkZSBhcmdlbnRpbmEgZGVzZGUgYm9saXZpYSBVTiBDb210cmFkZQ0KZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZV91c2QgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL3Jlc3VsdGFkb3MvZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZS5jc3YiKSAlPiUNCiAgc2VsZWN0KFBlcmlvZCwgIlRyYWRlIEZsb3ciLCBSZXBvcnRlciwgUGFydG5lciwgIkNvbW1vZGl0eSBDb2RlIiwgQ29tbW9kaXR5LA0KICAgICAgICAgUXR5LCB0cmFkZV92YWx1ZV91c2QsIHByZWNpb19pbXBvX2dhc19ib2xpdmlhLCB1bmlkYWRfcHJlY2lvLCB1bmlkYWRfY2FudGlkYWQpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QpICU+JSANCiAgbXV0YXRlKHByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlID0gY29udmVyc29yX20zTU1CVFVfcChwcmVjaW9faW1wb19nYXNfYm9saXZpYSksDQogICAgICAgICB1bmlkYWQgPSAidXNkL01NQlRVIikNCg0KI3Bhc2FqZSBhIHBlc29zDQpnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlIDwtIGdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHByZWNpb19pbXBvX2dhc19ib2xpdmlhID0gcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEgKiB0Y2MsDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gImFycy9NaWxlcyBkZSBtMyIpDQoNCg0KI3ByZWNpbyBleHBvIGJvbGl2aWEgVU4gQ09NVFJBREUNCmdhc19leHBvX2JvbGl2aWFfY29tdHJhZGVfdXNkIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9yZXN1bHRhZG9zL2dhc19leHBvX2JvbGl2aWFfY29tdHJhZGUuY3N2IikgJT4lDQogIHNlbGVjdChQZXJpb2QsICJUcmFkZSBGbG93IiwgUmVwb3J0ZXIsIFBhcnRuZXIsICJDb21tb2RpdHkgQ29kZSIsIENvbW1vZGl0eSwNCiAgICAgICAgIFF0eSwgdHJhZGVfdmFsdWVfdXNkLCBwcmVjaW9fZXhwb19nYXNfYm9saXZpYSwgdW5pZGFkX3ByZWNpbywgdW5pZGFkX2NhbnRpZGFkKSAlPiUgDQogIHJlbmFtZShhbmlvID0gUGVyaW9kKSAlPiUgDQogICBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfYXJnX01NQlRVX2NvbXRyYWRlID0gY29udmVyc29yX20zTU1CVFVfcChwcmVjaW9fZXhwb19nYXNfYm9saXZpYSksDQogICAgICAgICB1bmlkYWQgPSAidXNkL01NQlRVIikNCg0KI3Bhc2FqZSBhIHBlc29zDQpnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlIDwtICBnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlX3VzZCAlPiUNCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEgPSBwcmVjaW9fZXhwb19nYXNfYm9saXZpYSAqIHRjYywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiYXJzL01pbGVzIGRlIG0zIikNCmBgYA0KDQojIyMjIyBUb2RvcyBsb3MgcHJlY2lvcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNQcmVjaW8gZGUgZXhwb3J0YWNpb24geSByZWZlcmVuY2lhIGRlIEdhcy4gTWVyZ2UgZGUgYmFzZXMNCg0KI3ByZWNpb3MgZW4gdXNkDQpwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgPC0gcHJpY2VfZWV1dV9NTUJUVSAlPiUgDQogIGxlZnRfam9pbiggIGhlbnJ5X2h1YikgJT4lDQogIGxlZnRfam9pbihicF9nYXNfcHJpY2VzKSAlPiUgDQogIGxlZnRfam9pbihmbWlfZ2FzX3ByaWNlKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19ib2xpdmlhX3VzZF9NTUJUVV95cGZiKSAlPiUgDQogIGxlZnRfam9pbihnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlX3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19pbXBvX2dhc19hcmdfYm9saXZpYV9jb210cmFkZSA9IHByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlKSkgJT4lIA0KICBsZWZ0X2pvaW4oZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZV91c2QgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCANCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19jb210cmFkZSA9IHByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19NTUJUVV9jb210cmFkZSkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19pZGVlX2ltcG9fZ2FzICU+JSBzZWxlY3QoYW5pbywgcHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9fZ2FzX3VzZCkgJT4lIA0KICBtdXRhdGUocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfaWRlZSA9IGNvbnZlcnNvcl9tM01NQlRVX3AocHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlLzEwMDApLCNvaw0KICAgICAgICAgcHJlY2lvX2V4dGVybm9fZ2FzID0gY2FzZV93aGVuKCBhbmlvIDwgMTk2NiB+IHByZWNpb19pbXBvX2dhc19hcmdfYm9saXZpYV9jb210cmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVH4gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfYXJnX2NvbXRyYWRlKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMsIGV2ZXJ5dGhpbmcoLiksIC1wcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQpwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUNCiAgc2VsZWN0KC11bmlkYWQpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBtdXRhdGVfYWxsKGNvbnZlcnNvcl9NTUJUVWJlcF9wKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkL2JlcCIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KY29tcGFyYWNpb25fYmVwIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19iZXAgJT4lIA0KICAgICMgc2VsZWN0KGFuaW8sIHByZWNpb19leHRlcm5vX2dhcykgJT4lDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGJyZW50X2hpc3RvcmljLCB3dGlfc3BvdF9wcmljZV9mcmVkLA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJ1c2QvYmVwIikNCiAgDQojIHByZWNpb19tZG9tdW5kaWFsX2dhc19NbTMgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JQ0KIyAgIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQojICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KIyAgIG11dGF0ZV9hbGwoY29udmVyc29yX20zTU1CVFVfcCkgJT4lIA0KIyAgIG11dGF0ZSh1bmlkYWQgPSAidXNkL2JlcCIpICU+JSANCiMgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KICANCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoTU1CVFUgPSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgQkVQID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCksIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fbWRvX211bmRpYWxfZ2FzLnhsc3giKQ0KDQojZ3JhZmljbyBwcmVjaW9zIGJlcA0KZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfZ2FzX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fZXh0ZXJub19nYXMpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogICMgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUiLCAicHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlIiwgInByZWNpb19leHBvX2dhc19pbmRlYyIpKSkgJT4lDQogIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh5ID0gInVzZC9iZXAiKQ0KIyBwbG90bHk6OmdncGxvdGx5KGdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19iZXApDQoNCmdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19tbWJ0dSA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lIA0KICBmaWx0ZXIocHJlY2lvX2V4dGVybm9fZ2FzIDwgMjUpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogIGZpbHRlcigNCiAgICB2YWxvciA8IDI1LA0KICAgICEodGlwb19wcmVjaW8gJWluJSBjKCJicF9vaWxfbWl4X21lYW5fb2VjZCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInByZWNpb19pbXBvX2dhc19hcmdfYm9saXZpYV9jb210cmFkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkgJT4lDQogICMgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZSgpICsNCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBsYWJzKHRpdGxlID0gIlByZWNpb3MgZGUgZXhwb3J0YWNpw7NuIHkgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBtdW5kaWFsIGRlbCBnYXMiLCANCiAgICAgICB5ID0gInVzZC9NTUJUVSIpDQpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfbW1idHUsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCg0KI3ByZWNpb3MgZW4gYXJzLiBJTkNPTVBMRVRPDQpwcmVjaW9fZXhwb195X21lX2dhcyA8LSBwcmVjaW9fZXhwb19nYXMgJT4lDQogIGZ1bGxfam9pbihwcmVjaW9faWRlZV9pbXBvX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19nYXNfYm9saXZpYV9pZGVlKSkgJT4lIA0KICBmdWxsX2pvaW4ocHJlY2lvX2V4cG9fYm9saXZpYV9wZXNvc195cGZiICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fYm9saXZpYV95cGZiID0gcHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzX3Blc29zICkpICU+JSANCiAgZnVsbF9qb2luKGdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywNCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbXBvX2dhc19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEgKSkgJT4lIA0KICBsZWZ0X2pvaW4oZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLCANCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2dhc19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEgKSkgJT4lDQogIGxlZnRfam9pbihoZW5yeV9odWIpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX2V4cG9feV9tZV9nYXMsIHBhdGggPSAicHJlY2lvX2V4cG9feV9tZG9fbXVuZGlhbF9nYXMueGxzeCIpDQojIHdyaXRleGw6OndyaXRlX3hsc3goY29tcGFyYWNpb25fYmVwLCBwYXRoID0gImNvbXBhcmFjaW9uX2JlcC54bHN4IikNCg0KDQpjb21wYXJhY2lvbl9wcmVjaW9zIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19nYXNfbWRvaW50KSkNCiANCmBgYA0KYnVzY2Ftb3MgdW4gcHJlY2lvDQoNCmN1YW50byBlcyB1bmEgY2FudGlkYWQgZGUgYnR1IGRlIGdhcyBhbCBwcmVjaW8gZGUgcmVmZXJlbmNpYSAoZWogYm9saXZpYSkgeSBjdWFudG8gZXMgc2kgY29udmllcnRvIGVzb3MgYnR1IGEgYmFycmlsZXMgeSBsb3MgdmFsb3Jpem8gY29uIGVsIHByZWNpbyBkZWwgYmFycmlsPyBjdWFudG8gcXVlZGEgbGEgdW5pZGFkIGVuIGJ0dSBzaSB0b21vIGVsIHByZWNpbyBkZSBwZXRyb2xlbyB5IGxvIGNvdmllcnRvIGEgYnR1LiANCmVzIGRlY2lyLCBjdWFudG8gZXMgZWwgdmFsb3Igc2kgbGEgdmFsb3Jpem8gZW4gcHJlY2lvIGRlbCBwZXRyb2xlbw0KDQrCv2N1YW50b3MgdXNkIGVzIHVuIGJ0dSBkZSBwZXRyb2xlbz8NCnNpIHRvbW8gdW4gYmFycmlsIGRlIHBldHJvbGVvIHkgbG8gY29udmllcnRvIGEgYnR1ICggbWUgdmEgYSBkYXIgY3VhbnRvcyB1c2QgZXMgdW4gYnR1KQ0KbHVlZ28gY29tcGFybyBsb3MgdXNkL2J0dSB5IGxvIGNvbXBhcm8gY29uIGVsIGdhcyBkZSBib2xpdmlhDQoNCmdyaW5iZXI6IGNvbnZpZXJ0ZSB0b2RvIGVsIGdhcyBlbiBwZXRyb2xlbyB5IGxlIHBvbmUgZWwgcHJlY2lvIGRlIHBldHJvZWxvZS4gc3ViZXN0aW1hIGxvcyBwcmVjaW9zIGRlbCBnYXM/DQoNCmBgYHtyfQ0KcHJlY2lvX2NydWRvX3ZzX2dhcyA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC11bmlkYWQpICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICA9IHByZWNpb19jcnVkb191c2RfYmJsLA0KICAgICAgICAgICAgICAgICAgICAgMjpuY29sKC4pKSwgYnkgPSJhbmlvIikgJT4lIA0KICBtdXRhdGUocHJlY2lvX2NydWRvX3NvYnJlX2dhcyA9cHJlY2lvX2NydWRvX3VzZF9iYmwvcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGZpbHRlcighKGlzLm5hKHByZWNpb19jcnVkb19zb2JyZV9nYXMpKSwgDQogICAgICAgICAhKHRpcG9fcHJlY2lvX2NydWRvICVpbiUgYygid3RpX3Nwb3RfcHJpY2VfZnJlZCIsICJwcmVjaW9fbWVfY3J1ZG8iKSkgICkNCiAgICAgICAgICMgKHRpcG9fcHJlY2lvX2NydWRvICVpbiUgYygiYnJlbnRfaWVhIikpICApDQogICAgICAgICAjICh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoImJyZW50X2llYSIsICJicmVudF9oaXN0b3JpYyIpKSAgKQ0KcHJlY2lvX2NydWRvX3ZzX2dhcw0KDQpncmFmIDwtICBwcmVjaW9fY3J1ZG9fdnNfZ2FzICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCBwcmVjaW9fY3J1ZG9fc29icmVfZ2FzLCBjb2xvcj10aXBvX3ByZWNpb19jcnVkbykpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJwcmVjaW8gZGVsIGNydWRvIHNvYnJlIGVsIGRlbCBnYXMgKGFtYm9zIGVuIGJhcnJpbGVzKSIpDQoNCmdncGxvdGx5KGdyYWYsIHdpZHRoID0gODAwLCBsZW5ndGg9NjAwKQ0KIyBncmFmDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fY3J1ZG9fdnNfZ2FzLCBwYXRoPSAicHJlY2lvIGRlbCBjcnVkbyB2cyBnYXMueGxzeCIpICANCmBgYA0KDQoNCg0KIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMNCg0KKiBGdWVudGVzDQogICsgW1NFU0NPIERvd25zdHJlYW1dKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvZW5lcmdpYS1yZWZpbmFjaW9uLWNvbWVyY2lhbGl6YWNpb24tcGV0cm9sZW8tZ2FzLWRlcml2YWRvcy10YWJsYXMtZGluYW1pY2FzKQ0KICArIElOREVDDQogICsgTUVDT04NCiAgKyBVTkNvbXRyYWRlDQoNCiMjIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgZGUgQ3J1ZG8NCiogRXhwb3J0YWNpb25lcyBkZSBDcnVkbzogDQogICsgMTk2MiBhIDE5OTM6IFVOIENvbXRyYWRlDQogICsgMTk5NCBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICArIExvcyBkYXRvcyBmYWx0YW50ZXMgZGUgU0VTQ08gc2UgY29tcGxldGFyb24gY29uIE1FQ09ODQogICsgU2lndWVuIGhhYmllbmRvIGRhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTY1LCAxOTcwLTc0LCAxOTc2LTc4LCAxOTgwLTg0DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgU0VTQ08NCiNjYW50aWRhZGVzLiBwb3N0IDIwMTAgKGhhc3RhIDIwMTkpDQppbXBvcnRhY2lvbmVzX2V4cG9ydGFjaW9uZXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL2ltcG9ydGFjaW9uZXMtZXhwb3J0YWNpb25lcy5jc3YiKQ0KDQojIGNhbnRpZGFkZXMuIHBvc3QgMjAxNiANCmltcG9ydGFjaW9uZXNfZXhwb3J0YWNpb25lc19wb3N0MjAxNiA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vaW1wb3J0YWNpb25lcy1leHBvcnRhY2lvbmVzLWEtcGFydGlyLWRlbC0yMDE2LS5jc3YiKQ0KDQojIyMjY29tZXJjaW8gZXh0ZXJpb3IgcG9zdCAyMDEwOiAiVERfY29tZXJjaW9fZXh0ZXJpb3IueGxzeCINCmNvbWV4X3Bvc3QyMDEwIDwtIHJlYWRfZGVsaW0oIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2NvbWV4X3Bvc3QyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDUpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9IGNhc2Vfd2hlbihEYXRvcyA9PSAiU3VtYSBkZSBtb250byIgfiAidXNkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSwNCiAgICAgICAgIAl1bmlkYWQgPSBzdHJfcmVtb3ZlX2FsbCgJdW5pZGFkLCAiWygpXSIgKSwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSkgJT4lICANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICByZW5hbWUoZXhwb3J0YWNpb24gPSAiRXhwb3J0YWNpw7NuIiwNCiAgICAgICAgIGltcG9ydGFjaW9uID0gIkltcG9ydGFjacOzbiIpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBhbmlvLCBtZXMsIGV2ZXJ5dGhpbmcoLiksIC1jKCJUb3RhbCBnZW5lcmFsIiwgRGF0b3MpKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNjo3KQ0KDQojb3RyYSBiYXNlLiBzb2xvIGNhbnRpZGFkZXMuIHZlciBkZSBkb25kZSBhcGFyZWNpw7MNCmltcG9fZXhwbyA8LSByZWFkX2NzdigiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvaW1wb3J0YWNpb25lcy1leHBvcnRhY2lvbmVzICgxKS5jc3YiKQ0KDQoNCiMjI2V4cG9ydGFjaW9uZXMgcHJlIDIwMTA6ICJFeHBvcnRhY2lvbmVzLnhsc3giDQpleHBvX3ByZTIwMTAgPC0gcmVhZF9kZWxpbSgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhwb19wcmUyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIG1lcyA9ICJNZXMiLA0KICAgICAgICAgcHJvZHVjdG8gPSBQcm9kdWN0bywNCiAgICAgICAgIHZhbG9yID0gVG90YWwpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBtZXMgPSB6b286Om5hLmxvY2YobWVzKSwNCiAgICAgICAgIHByb2R1Y3RvID0gem9vOjpuYS5sb2NmKHByb2R1Y3RvKSwNCiAgICAgICAgIHZhcmlhYmxlID0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KERhdG9zLCAiTTMiKSB+ICJtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIlRvbiIpIH4gInRvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIkZPQiIpIH4gInVzZCIpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoRGF0b3MpKQ0KDQojbm8gc2UgZGUgZG9uZGUgc2FsacOzIGVzdGUgcGVybyBoYWJyaWEgcSByYXN0cmVhcmxvDQpleHBvX3VzZF90b24gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9leHBvX3VzZF90b24uY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFLCANCiAgICBza2lwID0gMykNCg0KIyMjaW1wb3J0YWNpb25lcyBwcmUgMjAxMDogIkltcG9ydGFjaW9uZXMueGxzeCINCmltcG9fcHJlMjAxMCA8LSByZWFkX2RlbGltKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9pbXBvX3ByZTIwMTAuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgbWVzID0gIk1lcyIsDQogICAgICAgICBwcm9kdWN0byA9IFByb2R1Y3RvLA0KICAgICAgICAgdmFsb3IgPSBUb3RhbCkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHpvbzo6bmEubG9jZihhbmlvKSwNCiAgICAgICAgIG1lcyA9IHpvbzo6bmEubG9jZihtZXMpLA0KICAgICAgICAgcHJvZHVjdG8gPSB6b286Om5hLmxvY2YocHJvZHVjdG8pLA0KICAgICAgICAgdmFyaWFibGUgPSAiaW1wb3J0YWNpb24iLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgbWVzKSwgb3JkZXJzID0gInltIikpLA0KICAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoRGF0b3MsICJNMyIpIH4gIm0zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KERhdG9zLCAiVG9uIikgfiAidG9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KERhdG9zLCAiRk9CIikgfiAidXNkIikpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pLCAtYyhEYXRvcykpDQojIGltcG9fcHJlMjAxMA0KDQoNCiNCYXNlIHVuaWRhIGRlIFNFU0NPDQpjb21lcmNpb19leHRlcmlvciA8LSBjb21leF9wb3N0MjAxMCAlPiUgDQogIGJpbmRfcm93cyhpbXBvX3ByZTIwMTAsIGV4cG9fcHJlMjAxMCkgJT4lIA0KICBhcnJhbmdlKGZlY2hhKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm1pbGVzL20zIiB+IHZhbG9yICogMTAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvciksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJtaWxlcy9tMyIgfiAibTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB1bmlkYWQpKQ0KDQojZXhwbyBlIGltcG8gZGUgQ3J1ZG8uIGNhbnRpZGFkZXMgeSB2YWxvcg0KY29tZXhfY3J1ZG9fc2VzY28gPC0gY29tZXJjaW9fZXh0ZXJpb3IgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlBFVFJPTEVPIikgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiQ3VlbmNhIiksDQogICAgICAgICB1bmlkYWQgIT0gIlRvbiIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICU+JSANCiAgbXV0YXRlKHByb2R1Y3RvID0gImNydWRvIiwNCiAgICAgICAgIHZhbG9yID0gY2FzZV93aGVuKHVuaWRhZCA9PSAibTMiIH4gY29udmVyc29yX20zYmJsX3EodmFsb3IpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZhbG9yKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm0zIiB+ICJiYXJyaWxlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCkpDQoNCg0KI3F1w6kgcHJvZHVjdG9zIGVudHJhbiBlbiBlbCBmaWx0cm8gZGUgY3J1ZG8/DQojIHVuaXF1ZSgoY29tZXJjaW9fZXh0ZXJpb3IgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiUEVUUk9MRU8iKSB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJDdWVuY2EiKSkpJHByb2R1Y3RvKQ0KDQoNCiNNRUNPTg0KY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIA0KICAgIHNoZWV0ID0gIkNvbS4gZXh0ZXJpb3IiLCBza2lwID0gNykgJT4lDQogIHJlbmFtZShhbmlvID0gJy4uLjEnICwNCiAgICAgICAgIGV4cG9fTW0zX2NydWRvID0gJ0V4cG9ydGFjaW9uZXMuLi4yJywNCiAgICAgICAgIGltcG9fTW0zX2NydWRvID0gJ0ltcG9ydGFjaW9uZXMuLi4zJywNCiAgICAgICAgIHNhbGRvX01tM19jcnVkbyA9IGBCYWxhbmNlIChYLU0pLi4uNGAsDQogICAgICAgICBleHBvX01NbTNfZ2FzID0gJ0V4cG9ydGFjaW9uZXMuLi41JywNCiAgICAgICAgIGltcG9fTW0zX2dhcyA9ICdJbXBvcnRhY2lvbmVzLi4uNicsDQogICAgICAgICBzYWxkb19NbTNfZ2FzID0gYEJhbGFuY2UgKFgtTSkuLi43YCwNCiAgICAgICAgIGV4cG9fbWV0YWxpZmVyb3Nfb3Ryb3NfTU11c2QgPSBgTWluZXJhbGVzIG1ldGFsw61mZXJvcywgZXNjb3JpYXMgeSBjZW5pemFzYCwNCiAgICAgICAgIGV4cG9fY3J1ZG9fTU11c2QgPSBgUGV0csOzbGVvIGNydWRvYCwNCiAgICAgICAgIGV4cG9fZ2FzX01NdXNkID0gYEdhcyBkZSBwZXRyw7NsZW8geSBvdHJvcyBoaWRyb2NhcmJ1cm9zYCwNCiAgICAgICAgIGV4cG9fY2FyYnVyYW50ZXNfb3Ryb3NfTU11c2QgPSBgQ2FyYnVyYW50ZXMsIGdyYXNhcyB5IGFjZWl0ZXMgbHVicmljYW50ZXNgLA0KICAgICAgICAgZXhwb19lbGVjdHJpY2FfTU11c2QgPSBgRW5lcmfDrWEgZWzDqWN0cmljYWAsDQogICAgICAgICBleHBvX3Jlc3RvX2NvbWJ1c3RpYmxlc19NTXVzZCA9IGBSZXN0byBkZSBjb21idXN0aWJsZXNgKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbyApKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIG11dGF0ZShleHBvX2JibF9jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9xKGV4cG9fTW0zX2NydWRvKjEwMDApLA0KICAgICAgICAgaW1wb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShpbXBvX01tM19jcnVkbyoxMDAwKSwNCiAgICAgICAgIHNhbGRvX2JibF9jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9xKHNhbGRvX01tM19jcnVkbyoxMDAwKSkNCg0KDQojSU5ERUMgLSBDb21FeA0KI2NhbnRpZGFkZXMNCmNhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICByZW5hbWUoZXhwb19pbmRlY19jcnVkbyA9IHBldHJvbGVvX2NydWRvX2V4cG8sDQogICAgICAgICAgIGV4cG9faW5kZWNfZ2FzICA9IGdhc19uYXR1cmFsX2V4cG8pDQoNCiN2YWxvcg0KZXhwb19oaWRyb192YWxvcl9pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvZXhwb19oaWRyb192YWxvci5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgcmVuYW1lKGV4cG9faW5kZWNfY3J1ZG8gPSBwZXRyb2xlb19jcnVkb19leHBvLA0KICAgICAgICAgICBleHBvX2luZGVjX2dhcyAgPSBnYXNfbmF0dXJhbF9leHBvKQ0KDQoNCg0KI01lcmdlIGRlIGJhc2VzDQojQ3J1ZG8gZXhwbyBjYW50aWRhZA0KZXhwb19xX2NydWRvIDwtIGNvbWV4X2NydWRvX3Nlc2NvICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIHVuaWRhZCA9PSAiYmFycmlsZXMiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgdmFsb3IpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgcmVuYW1lKGV4cG9fc2VzY29fY3J1ZG8gPSB2YWxvcikgJT4lIA0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX21lY29uX2NydWRvID0gZXhwb19iYmxfY3J1ZG8pKSAlPiUgDQogIGxlZnRfam9pbihjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWV4cG9faW5kZWNfZ2FzKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19jcnVkb19zaXRjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9jYW50aWRhZCwgZXhwb19jb210cmFkZV9jcnVkbyA9IGV4cG9fYmJsICkpICU+JSANCiAgbXV0YXRlKGV4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8IDE5OTQgfCBhbmlvID09IDE5OTkgfiBleHBvX2NvbXRyYWRlX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKGV4cG9fc2VzY29fY3J1ZG8pIH4gZXhwb19tZWNvbl9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGV4cG9fc2VzY29fY3J1ZG8pLA0KICAgICAgICAgdW5pZGFkID0gImJhcnJpbGVzIiwNCiAgICAgICAgIGRpZiA9IGV4cG9fY3J1ZG8vZXhwb19pbmRlY19jcnVkbyAtIDEpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCxleHBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtdmFyaWFibGUpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KDQoNCiMgTWVyZ2UgY3J1ZG8gVVNEDQpleHBvX3VzZF9jcnVkbyA8LSBjb21leF9jcnVkb19zZXNjbyAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iICwgdW5pZGFkID09ICJ1c2QiKSAlPiUgDQogIHJlbmFtZShleHBvX2NydWRvX3Nlc2NvID0gdmFsb3IpICU+JQ0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2NydWRvX21lY29uID0gZXhwb19jcnVkb19NTXVzZCkpICU+JSANCiAgbGVmdF9qb2luKGV4cG9faGlkcm9fdmFsb3JfaW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19pbmRlY19jcnVkbykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fY3J1ZG9fc2l0YyAlPiUgDQogICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ZhbG9yLCBleHBvX2NvbXRyYWRlX2NydWRvID0gZXhwb191c2RfY29tdHJhZGVfY3J1ZG8pKSAlPiUNCiAgbXV0YXRlKGV4cG9fY3J1ZG9fbWVjb24gPSBleHBvX2NydWRvX21lY29uICoxMDAwMDAwLA0KICAgICAgICAgZXhwb19jcnVkbyA9IGNhc2Vfd2hlbihhbmlvIDwxOTk0IH4gZXhwb19jb210cmFkZV9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk0IH4gZXhwb19jcnVkb19zZXNjbykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLWModmFyaWFibGUsIHByb2R1Y3RvKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3gvMTBeNn0pDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHVzZCA9IGV4cG9fdXNkX2NydWRvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbnRpZGFkZXMgPSBleHBvX3FfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVjaW9fZXhwb3J0YWNpb25feV9yZWZlcmVuY2lhID0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyksIA0KICAgICAgICAgICAgICAgICAgICAjIHBhdGggPSAiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9yZXN1bHRhZG9zL2V4cG9fY3J1ZG8ueGxzeCIpDQoNCmV4cG9fcV9jcnVkbw0KZXhwb191c2RfY3J1ZG8NCmBgYA0KDQoNCiMjIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgZGUgR2FzDQoqIEZ1ZW50ZXMgc2VsZWNjaW9uYWRhczoNCiArIDE5NjIgYSAxOTk2OiBVTiBDb210cmFkZSwNCiArIDE5OTcgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTk5IHkgMjAwMA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1NFU0NPDQpjb21leF9nYXMgPC0gY29tZXJjaW9fZXh0ZXJpb3IgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIkdBUyBOQVRVUkFMIikgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiR2FzIE5hdHVyYWwiKSANCiAgICAgICAgIHwgc3RyX2RldGVjdChwcm9kdWN0bywgIkdhcyBkZSBSZWZpbmVyw61hIiksDQogICAgICAgICBwcm9kdWN0byAhPSAiR2FzIE5hdHVyYWwgTGljdWFkbyIsDQogICAgICAgICB1bmlkYWQgIT0gIlRvbiIpICU+JQ0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSklPiUgDQogIG11dGF0ZShwcm9kdWN0byA9ICJnYXMiKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChjb21leF9jcnVkb19zZXNjbyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAidXNkIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjb21leF9jcnVkb19zZXNjbyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAidXNkIiwgdmFyaWFibGUgPT0gImltcG9ydGFjaW9uIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjb21leF9nYXMgJT4lIGZpbHRlcih1bmlkYWQgPT0gInVzZCIsIHZhcmlhYmxlID09ICJpbXBvcnRhY2lvbiIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXhfZ2FzICU+JSBmaWx0ZXIodW5pZGFkID09ICJ1c2QiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKSksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiY29tZXhfc2VzY28ueGxzeCIpDQoNCiNFeHBvIGdhcyBTRVNDTyBjYW50aWRhZGVzDQpleHBvX3Nlc2NvX3FfZ2FzIDwtIGNvbWV4X2dhcyAgJT4lDQogIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iLA0KICAgICAgICAgdW5pZGFkID09ICJtMyIpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1jKHZhcmlhYmxlLCBwcm9kdWN0bykpICU+JQ0KICByZW5hbWUoZXhwb19zZXNjb19nYXMgPSB2YWxvcikgJT4lDQogIG11dGF0ZShleHBvX3Nlc2NvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19zZXNjb19nYXMsIDAgKSwNCiAgICAgICAgIGV4cG9fc2VzY29fZ2FzID0gZXhwb19zZXNjb19nYXMgLyAxMDAwLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KI2V4cG8gc2VzY28gZ2FzIHZhbG9yDQpleHBvX3Nlc2NvX3VzZF9nYXMgPC0gY29tZXhfZ2FzICAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIsDQogICAgICAgICB1bmlkYWQgPT0gInVzZCIpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1jKHZhcmlhYmxlLCBwcm9kdWN0bykpICU+JQ0KICByZW5hbWUoZXhwb19zZXNjb19nYXMgPSB2YWxvcikgJT4lDQogIG11dGF0ZShleHBvX3Nlc2NvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19zZXNjb19nYXMsIDAgKSkNCg0KDQojZXhwbyBVTiBDb210cmFkZQ0KZXhwb19nYXNfc2l0YyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9leHBvX2dhc19zaXRjLmNzdiIpICAlPiUgDQogIHJlbmFtZSh0cmFkZV92YWx1ZV91c2QgPSAiVHJhZGUgVmFsdWUgKFVTJCkiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAidXNkIiwNCiAgICAgICAgIGV4cG9fTW0zID0gZXhwb19NbTMgLzEwMDAsDQogICAgICAgICB1bmlkYWRfY2FudGlkYWQgPSAgIk1pbGVzIGRlIG0zIikNCg0KDQojTWVyZ2UgY2FudGlkYWRlcw0KZXhwb19xX2dhcyA8LSAgZXhwb19zZXNjb19xX2dhcyAlPiUgDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX21lY29uID0gZXhwb19NTW0zX2dhcykgJT4lDQogICAgICAgICAgICAgIG11dGF0ZSh1bmlkYWQgPSAiTWlsZXMgZGUgbTMiLA0KICAgICAgICAgICAgICAgICAgICAgZXhwb19nYXNfbWVjb24gPSBleHBvX2dhc19tZWNvbiAqIDEwMDApICkgJT4lIA0KICBsZWZ0X2pvaW4oY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1leHBvX2luZGVjX2NydWRvKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19nYXNfc2l0YyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX2NvbXRyYWRlID0gZXhwb19NbTMsIHVuaWRhZCA9IHVuaWRhZF9jYW50aWRhZCApKSAlPiUgDQogICMgbXV0YXRlKGRpZiA9IGV4cG9fc2VzY29fZ2FzLyBleHBvX2luZGVjX2dhcyAtIDEgKSAlPiUNCiAgbXV0YXRlKGV4cG9fZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTk3IH4gZXhwb19nYXNfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTk2IH5leHBvX3Nlc2NvX2dhcyApKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2dhcywgZXZlcnl0aGluZyguKSkNCg0KZXhwb19xX2dhc19NTUJUVSA8LSBleHBvX3FfZ2FzICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzZWxlY3QoLWModW5pZGFkKSkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9xKHgqMTAwMCl9ICkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1NQlRVIikNCg0KI01lcmdlIHZhbG9yDQpleHBvX3VzZF9nYXMgPC0gZXhwb19zZXNjb191c2RfZ2FzICU+JQ0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19tZWNvbiA9IGV4cG9fZ2FzX01NdXNkKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShleHBvX2dhc19tZWNvbiA9IGV4cG9fZ2FzX21lY29uICogMTAwMDAwMCkpICAlPiUgDQogIGxlZnRfam9pbihleHBvX2hpZHJvX3ZhbG9yX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX2luZGVjID0gZXhwb19pbmRlY19nYXMpKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2dhc19zaXRjICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfY29tdHJhZGUgPSB0cmFkZV92YWx1ZV91c2QsIHVuaWRhZCApKSAlPiUgDQogICMgbXV0YXRlKGRpZiA9IGV4cG9fc2VzY29fZ2FzL2V4cG9fZ2FzX2luZGVjIC0xKSAlPiUgDQogIG11dGF0ZShleHBvX2dhcyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5NyB+IGV4cG9fZ2FzX2NvbXRyYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTcgfiBleHBvX3Nlc2NvX2dhcykpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19nYXMsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KICANCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoIGNhbnRpZGFkZXMgPSBleHBvX3FfZ2FzLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2QgPSBleHBvX3VzZF9nYXMsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX3lfcmVmZXJlbmNpYSA9IHByZWNpb19leHBvX3lfbWVfZ2FzKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvZXhwb19nYXMueGxzeCIpDQoNCiMgY29tZXhfY3J1ZG9fc2VzY28gJT4lIGZpbHRlcih1bmlkYWQgPT0gIm0zIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIikNCiMgY29tZXhfZ2FzICU+JSBmaWx0ZXIodW5pZGFkID09ICJtMyIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpDQpleHBvX3FfZ2FzIA0KZXhwb191c2RfZ2FzDQpgYGANCg0KDQoNCiMjIFJlZ2Fsw61hcw0KDQoqIEZ1ZW50ZXM6IA0KICArIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcykNCg0KDQpSRVZJU0FSIEVMIENBTENVTE8gREUgQkVUQU5JQSANCmN1YW50byBnYW5hcmlhbiBsYXMgcHJvdmluY2lhcyBzaSBlbCBwcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBzZSBhY29tb2RhIGFsIGludGVybmFjaW9uYWw/DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojcmVnYWxpYXMNCiNmaWx0cm8gY29uIHByb2R1Y3Rvcw0KcHJvZHVjdG9zIDwtIGxpc3QoImNydWRvIiwgImdhcyIsICJnYXNvbGluYSIsICJnbHAiKQ0KDQojbG9vcCBwYXJhIGxldmFudGFyIGxhcyBiYXNlcw0KbGlzdGFfcmVnYWxpYXMgPSBsaXN0KCkNCmZvcihpIGluIHByb2R1Y3Rvcyl7DQogIHJlZ2FsaWFzX2kgPC0gcmVhZF9kZWxpbShwYXN0ZTAoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmVnYWxpYXNfIiwgaSwgIi5jc3YiKSwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFLCANCiAgICBza2lwID0gMSkNCiAgbGlzdGFfcmVnYWxpYXNbW2ldXSA8LSByZWdhbGlhc19pDQp9DQoNCiNiYXNlcyBpbmRpdmlkdWFsZXMNCnJlZ2FsaWFzX2NydWRvIDwtIGxpc3RhX3JlZ2FsaWFzJGNydWRvICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJ1c2QiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiY3J1ZG8iKQ0KcmVnYWxpYXNfZ2FzIDwtIGxpc3RhX3JlZ2FsaWFzJGdhcyAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAiYXJzIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImdhcyIpDQpyZWdhbGlhc19nYXNvbGluYSA8LSBsaXN0YV9yZWdhbGlhcyRnYXNvbGluYSAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAidXNkIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImdhc29saW5hIikNCnJlZ2FsaWFzX2dscCA8LSBsaXN0YV9yZWdhbGlhcyRnbHAgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gImFycyIsDQogICAgICAgICBwcm9kdWN0byA9ICJnbHAiKQ0KDQojYmFzZSBjb21wbGV0YQ0KcmVnYWxpYXMgPC0gIHJlZ2FsaWFzX2NydWRvICU+JSANCiAgYmluZF9yb3dzKHJlZ2FsaWFzX2dhcywgcmVnYWxpYXNfZ2Fzb2xpbmEsIHJlZ2FsaWFzX2dscCkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLCANCiAgICAgICAgIHJlZ2FsaWFzX3RvdGFsID0gIlRPVEFMIFBST1ZJTkNJQSIpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGFuaW8sIG1lcywgcHJvZHVjdG8sIG1vbmVkYSwgcmVnYWxpYXNfdG90YWwsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ3JvdXBfYnkocHJvZHVjdG8sIGFuaW8sIG1vbmVkYSApICU+JSANCiAgc3VtbWFyaXNlKHJlZ2FsaWFzX3RvdGFsID0gc3VtKHJlZ2FsaWFzX3RvdGFsKSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICU+JSANCiAgbXV0YXRlKHJlZ2FsaWFzX3RvdGFsID0gY2FzZV93aGVuKG1vbmVkYSA9PSAidXNkIiB+IHJlZ2FsaWFzX3RvdGFsICogVENDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHJlZ2FsaWFzX3RvdGFsKSwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMiKSAlPiUgDQogIHNlbGVjdCgtYyhUQ0MsIG1vbmVkYSkpDQoNCnJlZ2FsaWFzDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChyZWdhbGlhcyAlPiUgDQojICAgc3ByZWFkKC4sDQojICAgICAgICAgIGtleSA9IGFuaW8sDQojICAgICAgICAgIHZhbHVlID0gcmVnYWxpYXNfdG90YWwpLCBwYXRoID0gInJlc3VsdGFkb3MvcmVnYWxpYXMueGxzeCIpDQpgYGANCg0KIyMgU3Vic2lkaW9zDQpgYGB7cn0NCiMgQ0VGSVAgY29udCBldCBhbC4gU3Vic2lkaW9zIGNvbW8gJSBkZWwgUEJJDQpzdWJzaWRpb3NfY2VmaXAgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3Mvc3Vic2lkaW9zL3N1YnNpZGlvcy54bHN4IikgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gc3Vic2lkaW9zX3BvcmNlbnRhamVfcGJpLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIGZpbHRlcihzZWN0b3IgJWluJSBjKCJDQU1NRVNBIiwgIlBsYW4gR2FzIiwiRU5BUlNBIiwgIlN1YnNpZGlvcyBGRiBHTiB5IEdMUCIpKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKSAlPiUgDQogIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwYmkpKSAlPiUNCiAgbXV0YXRlKHN1YnNpZGlvc19wb3JjZW50YWplX3BiaT1hcy5kb3VibGUoc3Vic2lkaW9zX3BvcmNlbnRhamVfcGJpKSwNCiAgICAgICAgIHN1YnNpZGlvc19jZWZpcCA9IHN1YnNpZGlvc19wb3JjZW50YWplX3BiaSAqIHBiaSAqIDEwXjYpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UodW5pZGFkID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgICAgc3Vic2lkaW9zX2NlZmlwPXN1bShzdWJzaWRpb3NfY2VmaXAsIG5hLnJtID0gVCkpDQoNCiNlamVzIA0Kc3Vic2lkaW9zX2VqZXMgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvc3Vic2lkaW9zLnhsc3giICkgJT4lIA0KICByZW5hbWUoc3Vic2lkaW9zX3VzZCA9IHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIHJpZ2h0X2pvaW4odGNwX2FudWFsX2IgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHRjYyksIGJ5ID0gImFuaW8iKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UodW5pZGFkID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgc3Vic2lkaW9zX2VqZXMgPSBzdWJzaWRpb3NfdXNkKnRjYyoxMF42KQ0KDQpzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyA8LSBzdWJzaWRpb3NfZWplcyU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgc3Vic2lkaW9zX2VqZXMpICU+JSANCiAgZnVsbF9qb2luKHN1YnNpZGlvc19jZWZpcCwgYnkgPWMoImFuaW8iLCAidW5pZGFkIikpICU+JSANCiAgYXJyYW5nZSgtYW5pbykgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlBlc29zIGNvcnJpZW50ZXMiKQ0KICAgICAgICAgIyB4ID0gc3Vic2lkaW9zX2NlZmlwL3N1YnNpZGlvc19lamVzKQ0Kc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgIA0KYGBgDQoNCg0KIyMgUG96b3MNCg0KDQojIyMgTWV0cm9zIHBlcmZvcmFkb3MNCg0KRnVlbnRlOg0KDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYV0oaHR0cHM6Ly9kYXRvcy5nb2IuYXIvZGF0YXNldC9lbmVyZ2lhLXBlcmZvcmFjaW9uLXBvem9zLXBldHJvbGVvLWdhcykNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbWV0cm9zX3BlcmZvcmFkb3NfcG9zdGVyaW9yX2FsXzIwMDkgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3Mvc2VjcmV0YXJpYSBkZSBlbmVyZ2lhL21ldHJvcy1wZXJmb3JhZG9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoaW5kaWNlX3RpZW1wbyA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlWS0lbSIpKSkNCg0KbWV0cm9zX3BlcmZvcmFkb3NfYW50ZXJpb3JfYWxfMjAwOSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9zZWNyZXRhcmlhIGRlIGVuZXJnaWEvbWV0cm9zLXBlcmZvcmFkb3MtYW50ZXJpb3ItYWwtMjAwOS5jc3YiKSAlPiUgDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKQ0KDQptZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhIDwtIG1ldHJvc19wZXJmb3JhZG9zX3Bvc3Rlcmlvcl9hbF8yMDA5ICU+JQ0KICBiaW5kX3Jvd3MobWV0cm9zX3BlcmZvcmFkb3NfYW50ZXJpb3JfYWxfMjAwOSkgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLCBpZGVtcHJlc2EsIGVtcHJlc2EsIGlkY29uY2VwdG8sIGNvbmNlcHRvLCBjYW50aWRhZCwgb2JzZXJ2YWNpb25lcyApICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgaWRlbXByZXNhLCBlbXByZXNhKSAlPiUNCiAgc3VtbWFyaXNlKG1ldHJvc19wZXJmb3JhZG9zID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KICANCg0KbWV0cm9zX3BlcmZvcmFkb3MgPC0gbWV0cm9zX3BlcmZvcmFkb3NfZW1wcmVzYSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UobWV0cm9zX3BlcmZvcmFkb3MgPSBzdW0obWV0cm9zX3BlcmZvcmFkb3MsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUoaW5kaWNlX21ldHJvcyA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBtZXRyb3NfcGVyZm9yYWRvcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gMjAwMSkpIA0KDQpncmFmX21ldHJvc19wZXJmb3JhZG9zIDwtIG1ldHJvc19wZXJmb3JhZG9zX2VtcHJlc2ElPiUgDQogIGdncGxvdChhZXMoYW5pbywgbWV0cm9zX3BlcmZvcmFkb3MsIGZpbGwgPSBlbXByZXNhKSkgKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgbGFicyh0aXRsZSA9ICJNZXRyb3MgcGVyZm9yYWRvcyBwb3IgZW1wcmVzYSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkNCmdncGxvdGx5KGdyYWZfbWV0cm9zX3BlcmZvcmFkb3MsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCg0KI2xpc3RhZG8gZGUgZW1wcmVzYXMgY29uIHN1cyBpZCdzDQpsaXN0YWRvX2VtcHJlc2EgPC0gZGlzdGluY3QobWV0cm9zX3BlcmZvcmFkb3NfZW1wcmVzYSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChpZGVtcHJlc2EsIGVtcHJlc2EpLGlkZW1wcmVzYSwgLmtlZXBfYWxsID0gVCkgDQogIA0KDQoNCmBgYA0KDQoNCg0KIyMjIFBvem9zIGVuIG9wZXJhY2nDs24NCg0KRnVlbnRlczoNCg0KKiBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIFtEYXRvcyBNSU5FTV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdG9zbWluZW0vcHJvZHVjY2lvbi1kZS1wZXRyb2xlby15LWdhcy1wb3ItcG96byk6DQogICsgW0xpc3RhZG8gZGUgcG96b3MgY2FyZ2Fkb3MgcG9yIGVtcHJlc2FzIG9wZXJhZG9yYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXBvci1wb3pvL2FyY2hpdm8vY2JmYTRkNzktZmZiMy00MDk2LWJhYjUtZWIwZGRlOWE4Mzg1KTogc2UgdG9tYSBsYSB2YXJpYWJsZSAiRmVjaGEgZGVsIEZpbiBkZSB0ZXJtaW5hY2nDs24gZGUgcGVyZm9yYWNpw7NuIGRlbCBwb3pvIiAoYWRqaXZfZmVjaGFfZmluX3Rlcm0pIGNvbW8gYcOxbyBkZSBwdWVzdGEgZW4gcHJvZHVjY2nDs24gZGVsIHBvem8uIFNlIHBvZHLDrWEgZWxhYm9yYXIgdW4gc3RvY2sgZGUgcG96b3MgYSBwYXJ0aXIgZGUgYWN1bXVsYXIgbG9zIHBvem9zIHRlcm1pbmFkb3MgeSByZXN0YW5kbyBsb3MgcG96b3MgYWJhbmRvbmFkb3MsIGFncnVwYW5kbyBjb24gbGEgdmFyaWFibGUgIkZlY2hhIGRlIGFiYW5kb25vIGRlbCBwb3pvIihhZGppdl9mZWNoYV9hYmFuZG9ubykNCiAgKyBbUG96b3MgdGVybWluYWRvc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3BlcmZvcmFjaW9uLWRlLXBvem9zLWRlLXBldHJvbGVvLXktZ2FzL2FyY2hpdm8vYTJjZTE0YWYtNWM1Ni00NWMyLTliOWMtYzdhMWU1MTU2ZGZmKQ0KICArIFtDYXDDrXR1bG8gSVZdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXBvci1wb3pvL2FyY2hpdm8vY2I1YzBmMDQtNzgzNS00NWNkLWI5ODItM2UyNWNhN2Q3NzUxKQ0KICArIFtFc3RhZG8gZGUgcG96b3NdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9lc3RhZG8tZGUtcG96b3MtZGUtcGV0cm9sZW8teS1nYXMpIChBVU4gTk8gU0UgUFJPQ0VTw5MgRVNUQSBCQVNFIE5JIExBIEFOVEVSSU9SKSANCiAgKyBbU0VTQ09dKGh0dHA6Ly93d3cuZW5lcmdpYS5nb2IuYXIvY29udGVuaWRvcy92ZXJwYWdpbmEucGhwP2lkcGFnaW5hPTE2MjQpDQoqIFtJQVBHXShodHRwczovL3d3dy5pYXBnLm9yZy5hci93ZWJfaWFwZy9zZWN0b3Jlcy9lc3RhZGlzdGljYXMvcHJvZHVjdG9zL2xpc3RhZG9zL2xpc3RhZG9fdG9kb3NfbG9zX3Byb2R1Y3Rvcy5odG0pLiBTZSBwcmVzZW50YW4gZG9zIHNlcmllczogdW5hIGVsYWJvcmFkYSBhIHBhcnRpciBkZSBsb3MgcG96b3MgcGVyZm9yYWRvcyBwb3IgYcOxbyAocmVzdWx0YW50ZSBkZSBkZXNjYXJnYXIgdW5hIGJhc2UgcG9yIGNhZGEgYcOxbyBkZWwgc2l0aW8gd2ViIG9maWNpYWwpIHkgb3RyYSBxdWUgY29ycmVzcG9uZGUgYWwgc3RvY2sgZGUgcG96b3MgZGUgcGV0csOzbGVvIGRlIGV4dHJhY2Npw7NuIGVmZWN0aXZhIChwcm9jZWRlbnRlIGRlIGxvcyBkYXRvcyBkZSBFc3RhZMOtc3RpY2FzIGRlbCBDZW50ZW5hcmlvIGRlIElBUEcpLg0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgbWVjaG89RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KIyBzZWMgZW5lcmdpYQ0KIyBwb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMNCmxpc3RhZG9fcG96b3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvY2FwaXR1bG8gaXYvbGlzdGFkby1kZS1wb3pvcy1jYXJnYWRvcy1wb3ItZW1wcmVzYXMtb3BlcmFkb3Jhcy5jc3YiKSAlPiUgDQogIG11dGF0ZShhbmlvX3Rlcm1pbmFjaW9uX3Bvem8gPXllYXIoYWRqaXZfZmVjaGFfZmluX3Rlcm0pKSAlPiUNCiAgbGVmdF9qb2luKGxpc3RhZG9fZW1wcmVzYSkgJT4lIA0KICBncm91cF9ieShhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIGlkZW1wcmVzYSwgZW1wcmVzYSkgJT4lIA0KICBzdW1tYXJpc2UocG96b3MgPSBuKCkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pKQ0KDQoNCiAgIyBtdXRhdGUoZW1wcmVzYSA9IGNhc2Vfd2hlbihpZGVtcHJlc2EgPT0gIllQRiIgfiAiWVBGIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiUEFFIiB+ICJQQUUiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJZU1VSIiB+ICJZU1VSIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiUExVIiB+ICJQbHVzcGV0cm9sIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiUExVRSIgfiAiUGx1c3BldHJvbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlZJUyIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJUUFQiIH4gIlRlY3BldHJvbCIsIA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJDR0MiIH4gIkNHQyIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIldJTiIgfiAiV2ludGVyc2hhbGwiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJUQVUiIH4gIlRvdGFsIEF1c3RyYWwiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJZU1VSIiB+ICJZU1VSIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiU0hFIiB+ICJTaGVsbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIkNBUCIgfiAiQ2FwZXgiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQUEFNIiB+ICJQYW1wYSIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gIk90cmEiKSkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlBFVFJPQlJBUyBBUkdFTlRJTkEgUy5BLiIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiUEVTQSAoUEVUUk9CUkFTIEUuUy5BLikiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBFTkVSR1kgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIllTVVIgUEVUUk9MRVJBIEFSR0VOVElOQSBTLkEuIiB+ICJZU1VSIikpDQoNCmdyYWZfcG96b3Nfc2VjX2VuZXJnaWEgPC0gbGlzdGFkb19wb3pvcyAlPiUgDQogIGdncGxvdChhZXMoYW5pb190ZXJtaW5hY2lvbl9wb3pvLCBwb3pvcywgZmlsbCA9IGVtcHJlc2EpKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiUG96b3MgY2FyZ2Fkb3MgcG9yIGVtcHJlc2FzIG9wZXJhZG9yYXMgKHBvciBhw7FvIGRlIHRlcm1pbmFjacOzbikiLA0KICAgICAgIGNhcHRpb24gPSAiU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEiKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvc19zZWNfZW5lcmdpYSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQogIA0KcG96b3NfdGVybWluYWRvc19hbnRlcmlvcl9hbF8yMDA5IDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9wb3pvcy10ZXJtaW5hZG9zLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgJT4lIA0KICByZW5hbWUoY2FudGlkYWQgPSBDYW50aWRhZCkNCg0KcG96b3NfdGVybWluYWRvcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9zZWNyZXRhcmlhIGRlIGVuZXJnaWEvcG96b3MtdGVybWluYWRvcy5jc3YiKSAlPiUgDQogIGJpbmRfcm93cyhwb3pvc190ZXJtaW5hZG9zX2FudGVyaW9yX2FsXzIwMDkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgaWRlbXByZXNhLCBlbXByZXNhICkgJT4lIA0KICBzdW1tYXJpc2UocG96b3MgID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKQ0KDQoNCmdyYWZfcG96b3NfdGVybWluYWRvcyA8LSBwb3pvc190ZXJtaW5hZG9zICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHBvem9zICwgZmlsbCA9IGVtcHJlc2EpKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiQ2FudGlkYWQgZGUgcG96b3MgdGVybWluYWRvcyIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX3Rlcm1pbmFkb3MsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI3Bvem9zIGlhcGcgKGJhc2VzIGFudWFsZXMpDQpwb3pvX2lhcGdfMDUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA1LnhscyIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwNSkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzA2IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwNi54bHMiLCANCiAgICBza2lwID0gMSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDYpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18wNyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDcueGxzIiwgDQogICAgc2tpcCA9IDEpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA3KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDggPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA4LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwOCkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzA5IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwOS54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDkpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xMCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTAueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDEwKSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDEyLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxMikgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzEzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxMy54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTMpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xNCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTQueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE0KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE1LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxNSkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzE2IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNi54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTYpDQoNCnBvem9faWFwZ18xNyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTcueGxzIiwgDQogICAgc2tpcCA9IDIpICAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxNykNCg0KcG96b19pYXBnXzE4IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxOC54bHMiLCANCiAgICBza2lwID0gMikgICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE4KQ0KDQpwb3pvX2lhcGdfMTkgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE5LnhscyIsIA0KICAgIHNraXAgPSAyKSAgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTkpICU+JSANCiAgcmVuYW1lKCJUb3RhbCBQb3pvcyIgPSAiVG90YWwgUG96b3MgVGVybWluYWRvcyIpDQoNCiNzZSBtZSBjb2xhcm9uIGFsZ3VuYXMgZmlsYXMgZGUgdG90YWxlcyBxdWUgaGF5IHF1ZSBib3JyYXINCnBvem9zX2lhcGcgPC0gcG96b19pYXBnXzA1ICU+JSANCiAgYmluZF9yb3dzKHBvem9faWFwZ18wNiwgcG96b19pYXBnXzA3LCBwb3pvX2lhcGdfMDgsIHBvem9faWFwZ18wOSwgDQogICAgICAgICAgICBwb3pvX2lhcGdfMTAsIHBvem9faWFwZ18xMiwgcG96b19pYXBnXzEzLCBwb3pvX2lhcGdfMTQsIHBvem9faWFwZ18xNSwNCiAgICAgICAgICAgIHBvem9faWFwZ18xNiwgcG96b19pYXBnXzE3LCBwb3pvX2lhcGdfMTgsIHBvem9faWFwZ18xOSkgJT4lDQogIHJlbmFtZSh0b3RhbF9wb3pvcyA9ICAiVG90YWwgUG96b3MiKSAlPiUgDQogIGZpbHRlcighKE9wZXJhZG9yICVpbiUgYygiVG90YWxlcyIsICJUT1RBTCIpKSAmICEoaXMubmEoT3BlcmFkb3IpKSApICU+JSANCiAgbXV0YXRlKGVtcHJlc2EgPWNhc2Vfd2hlbihPcGVyYWRvciA9PSAiWVBGIFMuQS4iIH4gIllQRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQQU4gQU1FUklDQU4gRU5FUkdZIFNMIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQQU4gQU1FUklDQU4iIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBFVFJPQlJBUyBBUkdFTlRJTkEgUy5BLiIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEVTQSAoUEVUUk9CUkFTIEUuUy5BLikiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlRFQ1BFVFJPTCBTLkEuIiB+ICJUZWNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQTFVTUEVUUk9MIFMuQS4iIH4gIlBsdXNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJTSU5PUEVDIEFSR0VOVElOQSBFWFBMT1JBVElPTiBJTkMiIH4gIlNpbm9wZWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0EiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQVUiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJZU1VSIEVORVJHw41BIEFSR0VOVElOQSBTLlIuTC4iIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gT3BlcmFkb3IpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShlbXByZXNhKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoZW1wcmVzYSwgYW5pbyx0b3RhbF9wb3pvcykgJT4lIA0KICBncm91cF9ieShhbmlvLCBlbXByZXNhKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9wb3pvcyA9IHN1bSh0b3RhbF9wb3pvcykpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KcG96b3NfaWFwZw0KDQpncmFmX3Bvem9zX2lhcGcgPC0gcG96b3NfaWFwZyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdG90YWxfcG96b3MsIGZpbGwgPSBlbXByZXNhKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIlBvem9zIHBlcmZvcmFkb3MiLA0KICAgICAgIGNhcHRpb24gPSAiSUFQRyIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX2lhcGcsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI3Bvem9zIGlhcGcgYWN1bXVsYWRvcw0KcG96b3NfaWFwZ19jZW50ZW5hcmlvIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9wb3pvc19pYXBnX2NlbnRlbmFyaW8uY3N2IiwgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHJlbmFtZSh0b3RhbGVzID0gdG90YWxlKQ0KDQpncmFmX3Bvem9zX2lhcGdfY2VudGVuYXJpbyA8LSBwb3pvc19pYXBnX2NlbnRlbmFyaW8gJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHRvdGFsZXMpKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiUG96b3MgZW4gZXh0cmFjY2nDs24gZGVmaW5pdGl2YSIsDQogICAgICAgY2FwdGlvbiA9ICJJQVBHIikNCmdncGxvdGx5KGdyYWZfcG96b3NfaWFwZ19jZW50ZW5hcmlvLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCiMgY29tcGFyYWNpb24gZGUgZnVlbnRlcw0KY29tcGFyYWNpb25fcG96b3MgPC0gcG96b3NfaWFwZyAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHBvem9zX3BlcmZvcmFkb3NfaWFwZyA9IHN1bSh0b3RhbF9wb3pvcywgbmEucm0gPSBUKSkgJT4lIA0KICByaWdodF9qb2luKHBvem9zX3Rlcm1pbmFkb3MgJT4lDQogICAgICAgICAgICAgICBncm91cF9ieShhbmlvKSAlPiUgDQogICAgICAgICAgICAgICBzdW1tYXJpc2UocG96b3NfdGVybWluYWRvc19zZWNfZW5lcmdpYSA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkpICU+JSANCiAgcmlnaHRfam9pbihsaXN0YWRvX3Bvem9zICU+JSANCiAgICAgICAgICAgICAgICByZW5hbWUoYW5pbyA9IGFuaW9fdGVybWluYWNpb25fcG96bykgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UocG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEgPSBzdW0ocG96b3MsIG5hLnJtID0gVCkpKSAlPiUgDQogIGZ1bGxfam9pbihwb3pvc19pYXBnX2NlbnRlbmFyaW8gJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUodmFyaWFjaW9uX3Bvem9zID0gdmFyaWFjaW9uX2ludGVyYW51YWwodG90YWxlcykpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcG96b3NfdmFyaWFjaW9uX2lhcGcgPSB2YXJpYWNpb25fcG96b3MpKSANCg0KDQpncmFmX3Bvem9zIDwtIGNvbXBhcmFjaW9uX3Bvem9zICU+JQ0KICBnYXRoZXIoa2V5ID0gImZ1ZW50ZSIsDQogICAgICAgICB2YWx1ZSA9ICJ2YWxvciIsDQogICAgICAgICAyOm5jb2woLikpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKCkrDQogICMgZ2VvbV9wb2ludCgpKw0KICB5bGltKDAsIDE3MDAgKSsNCiAgbGFicyh0aXRsZSA9ICJQb3pvcy4gQ29tcGFyYWNpw7NuIGRlIGZ1ZW50ZXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpnZ3Bsb3RseShncmFmX3Bvem9zLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KdmVyIHJlbGFjaW9uZXMNCiogUEJJIGhpZHJvY2FyYnVyb3MgLyBQQkkgdG90YWwgKHZlciBjdWFsIGVsZWdpcikNCiogY29ycmVnaXIgbnVlc3RybyBWQlAgZGVwdXJhbmRvIHNlcnZpY2lvcw0KKiBNSVAncyBjb2VmIHRlY25pY28gKHBhcmEgdmVyIENJIGVuIGVsIHNlY3RvciBwZXRyb2xlcm8geSBwZXNvIGRlbCBzZWN0b3IgcGV0cm9sZXJvIGVuIFBCSSkNCg0KKiBzdG9jayBwZXRyb2xlcm8gLyBzdG9jayB0b3RhbCBKSUMsRU0gDQoqIFN0b2NrIGV4dHJhY2Npb24gPSBQUHlFIFBBRSArIFBQeUUgVGVjcCArIFBQeUUgUGV0cm9icmFzIHVwc3RyICsgQWN0aXZvIFlQRiB1cHN0cmVhbQ0KICAqIHZlciBxdWUgcG9yY2VudGFqZSBxdWUgcmVwcmVzZW50YW4gZXN0YXMgZW1wcmVzYXMgZW4gbGEgcHJvZHVjY2lvbiBvIHBvem9zIHkgdmVyIGRlIGFtcGxpYXJsbyANCiAgKiB2ZXIgcmVsYWNpb24gQWN0aXZvIFlQRiB1cHN0cmVhbSAvIFBQeUUgaW50ZWdyYWRhIFlQRg0KICAqIHZlciByZWxhY2lvbiBnYW5hbmNpYXMgQUZJUCB5IEJPTFNBUiBjb24gZWwgc3RvY2sgY29ycmVzcG9uZGllbnRlIChjb2hlcmVuY2lhKSANCiAgKiB2ZXIgcmVsYWNpb24gY29uIENvcmVtYmVyZw0KICAqIHBhc2FyIEVOR0UgDQoNCipncmluYmVyZw0KICAqIGNvbnZlcnRpciBsbyBudWVzdHJvIGEgY29zdG9zLiBhZ2FycmFyIG51ZXN0cm9zIHZhbG9yIHkgZGl2aWRpcmxvIHBvciBiYXJyaWxlcyAoc3VtYW5kbyBnYXMgZW4gQk9FKQ0KICAqIGNvc3RvcyBwb3IgYmJsLCBwcmVjaW8gZWwgYmFycmlsIHkgcHJlY2lvIGRlIHByb2R1Y2Npb24gKHN1bW8gbGEgZ2NpYSBub3JtYWwgYWwgY29zdG8xKQ0KDQoNCiMjIEFjdGl2b3MNCg0KUGFzYXIgZGF0b3MgZGUgYnMgZGUgdXNvIGVuIHlhY2ltaWVudG9zIHBhcmEgYXJtYXIgcmVsYWNpw7NuIGFjdGl2byB5YWNpbWVpbnRvL3RvdGFsDQoNCkZ1ZW50ZXM6DQoNCiogQmFsYW5jZXMgZGUgQm9sc2FyICh1bmljYW1lbnRlIGVtcHJlc2FzIHF1ZSBjb3RpemFuIGVuIGxhIGJvbHNhIGRlIHZhbG9yZXMgYXJnZW50aW5hKS4gUmV2aXNhciBlbCBzdG9jayBkZWwgc2VjdG9yIGRpc3RyaWJ1Y2nDs24gcG9ycXVlIHNlIHByZXNlbnRhIGRlbWFzaWFkbyBncmFuZGUgY29uIHJlc3BlY3RvIGFsIGRlIGxvcyBkZW3DoXMuIEZhbHRhIHBhc2FyIGxvcyBkYXRvcyBkZWwgYWN0aXZvIGRlIGNhc2kgdG9kYXMgbGFzIGVtcHJlc2FzDQoqIEFGSVAuIENvbiBlc3RhIGZ1ZW50ZSBubyB0ZW5lbW9zIGNhbGN1bG8gZGUgcmVudGEsIHNpbm8gcXVlIHNvbG8gdXNhbW9zIGxhIFRHIGNvbW8gcGFyw6FtZXRyby4gTm90YTogIl9jIiBzaWduaWZpY2EgY2Fzb3MgcHJlc2VudGFkb3MgZGUgbGEgdmFyaWFibGUgY29ycmVzcG9uZGllbnRlDQoqIE1lbW9yaWFzIGRlIFlQRi4gTGEgZMOpY2FkYSBkZSBsb3MgODAgcHJlc2VudGEgcGljb3MgcXVlIGhheSBxdWUgcmV2aXNhcg0KDQoNCiogQ2FsY3VsbyBkZWwgQ2FwaXRhbCBUb3RhbCBBZGVsYW50YWRvIChLVEEpIA0KDQogICsgQm9sc2FyOiBFcyBlcXVpdmFsZW50ZSBhIGxhIHN1bWEgZGUgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG9zIE5ldGEgKGRlc2NvbnRhbmRvIGxvcyB0ZXJyZW5vcyB5IG9icmFzIGVuIGN1cnNvKSB5IGxvcyBJbnZlbnRhcmlvcy4gQ3VhbmRvIGxvcyBkYXRvcyBsbyBoYWJpbGl0YW4sIHNlIGxlIGFncmVnw7MgbG9zIHNhbGFyaW9zIGFkZWxhbnRhZG9zIChzYWxhcmlvcyB5IGNhcmdhcyBjb25zdW1pZG9zIHNvYnJlIHJvdGFjacOzbikuIEx1ZWdvLCBjdWFuZG8gbm8gc2UgcHJlc2VudGFyb24gZGF0b3MgZGUgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG9zLCBzZSB0b23DsyBlbCBhY3Rpdm8gbm8gY29ycmllbnRlLg0KICArIEFGSVA6IEVzIGVxdWl2YWxlbnRlIGEgbGEgc3VtYSBkZSBCaWVuZXMgZGUgVXNvLCBCaWVuZXMgZGUgQ2FtYmlvLCBJbnZlbnRhcmlvcyB5IERpc3BvbmliaWxpZGFkZXMuDQogICsgTWVtb3JpYSBZUEY6IFN1bWEgZGUgQmllbmVzIGRlIFVzbyB5IEJpZW5lcyBkZSBDYW1iaW8NCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEJPTFNBUg0KDQojc2VnbWVudG9zIGRlIFlQRiB5IFBldHJvYnJhcw0KeXBmX3NlZyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3lwZl9zZWdtZW50b3MuY3N2IiwgDQogICAgIiwiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHNlbGVjdCgtWDEpICU+JSANCiAgbXV0YXRlKHNlY3RvciA9IGNhc2Vfd2hlbiggc2VjdG9yID09ICAicXVpbWljYSIgfiAicGV0cm9xdWltaWNhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHNlY3RvciksDQogICAgICAgICBhbmlvID0geWVhcihmZWNoYSkpDQoNCnBldHJvYnJhc19hcl9zZWcgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9wZXRyb2JyYXNfYXJnX3NlZ21lbnRvcy5jc3YiLCANCiAgICAiLCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpJT4lIA0KICBzZWxlY3QoLVgxKQ0KDQp1bmlvbl9zZWdtZW50b3MgPC0geXBmX3NlZyAlPiUgDQogIHNlbGVjdChhbmlvLCBlbXByZXNhLHNlY3RvciwgdW5pZGFkLCBhY3Rpdm8gPSBhY3Rpdm9zKSAlPiUgDQogIGJpbmRfcm93cyhwZXRyb2JyYXNfYXJfc2VnICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBmZWNoYSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbyAsIGVtcHJlc2EsIHVuaWRhZCwgc2VjdG9yLCBwcm9wX3BsYW50YV9lcXVpcG8gPSBwcHllLCBhY3Rpdm8gPSBhY3Rpdm9zKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNTpuY29sKC4pKSAlPiUNCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHZhbG9yID12YWxvci9pcGNfMTgsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgc2VsZWN0KC1pcGNfMTgpDQoNCnN0b2NrX3NlZ21lbnRvcyA8LSB1bmlvbl9zZWdtZW50b3MgJT4lIA0KICBncm91cF9ieShhbmlvLCBzZWN0b3IsIHZhcmlhYmxlICx1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoZnVlbnRlID0gIkFjdGl2byBkZSBZUEYgeSBQZXRyb2JyYXMiLA0KICAgICAgICAgdmFyaWFibGVfc2VjdG9yID0gcGFzdGUodmFyaWFibGUsIHNlY3Rvciwgc2VwID0gIiAiKSkNCg0KDQojIyBTdG9jayBwb3IgZW1wcmVzYXMNCnN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICBmaWx0ZXIoICEoZW1wcmVzYSAlaW4lIGMoImNoZXZyb25fZ2xvYmFsIiwgInBldHJvYnJhc19nbG9iYWwiICkpKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIsDQogICAgICAgICBhbmlvID0geWVhcihmZWNoYSksDQogICAgICAgICBmdWVudGUgPSAiQm9sc2FyIikgJT4lDQogIHNlbGVjdChhbmlvLGZ1ZW50ZSwgZXZlcnl0aGluZyguKSwgLWMoZmVjaGEsIHBhaXMsIHRnX2FudCwgdGdfZGVzcCwgcm90YWNpb24pKSAlPiUgDQogICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNjpuY29sKC4pKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC9pcGNfMTgsDQogICAgICAgICBlbXByZXNhID0gY2FzZV93aGVuKGVtcHJlc2EgPT0gInBldHJvYnJhc19hciIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAidGVjcGV0cm9sIiB+ICJUZWNwZXRyb2wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJjYW11enppX3BhbXAiIH4gIkNhbXV6emkgR2FzIFBhbXBlYW5hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAibWV0cm9nYXMiIH4gIk1ldHJvZ2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGVtcHJlc2EpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGVtcHJlc2EsZnVlbnRlLCBzZWN0b3IsIHVuaWRhZCwgdmFyaWFibGUpICU+JQ0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgJWluJSBjKCJLVEEiLCAicHB5ZSIsICJwcHllX25ldGEiICwgImludmVudGFyaW9zIiwgImFjdGl2b19ub19jb3JyIiwgImFjdGl2byIpKQ0KICAgIA0KDQoNCiMjIFN0b2NrIHBvciByYW1hDQpzdG9ja19iYWxhbmNlc19yYW1hIDwtICBzdG9ja19iYWxhbmNlc19lbXByZXNhcyAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgYmluZF9yb3dzKHN0b2NrX3NlZ21lbnRvcyAlPiUgDQogICAgICAgICAgICAgICMgZmlsdGVyKHNlY3RvciA9PSAidXBzdHJlYW0iICYgdmFyaWFibGUgPT0gImFjdGl2byIpICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGVfc2VjdG9yID09ICJhY3Rpdm8gdXBzdHJlYW0iKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KC12YXJpYWJsZV9zZWN0b3IpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoc2VjdG9yID0gY2FzZV93aGVuKHNlY3RvciA9PSAidXBzdHJlYW0iIH4gInByb2R1Y2Npb24iKSwNCiAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gIGNhc2Vfd2hlbih2YXJpYWJsZSA9PSAiYWN0aXZvIiB+ICJwcHllIiksDQogICAgICAgICAgICAgICAgICAgICBmdWVudGUgPSAiQm9sc2FyIiwNCiAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPSJZUEYgeSBQZXRyb2JyYXMiKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBzZWN0b3IsdmFyaWFibGUsIHVuaWRhZCwgZnVlbnRlKSAlPiUNCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAgDQogIA0KICAjIHNwcmVhZChrZXkgPSBzZWN0b3IsDQogICMgICAgICAgIHZhbHVlID0gS1RBKSAlPiUgDQogICMgbXV0YXRlKGludGVncmFkYV95X2V4dHJhY2Npb24gPSBpbnRlZ3JhZGEgKyBwcm9kdWNjaW9uLA0KICAjICAgICAgICB2YXJpYWJsZSA9ICJLVEEiKSAlPiUgDQogICMgcmVuYW1lKGV4dHJhY2Npb24gPSBwcm9kdWNjaW9uKSAlPiUgDQogICMgc2VsZWN0KGFuaW8sIHZhcmlhYmxlLCBtb25lZGEsIGV2ZXJ5dGhpbmcoLikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojQUZJUA0KIyBTdG9jayBkZSBiYWxhbmNlcyAtICBBRklQDQpkYXRvc19hZmlwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0FGSVAvZ2NpYV92OC54bHN4IiwgDQogICAgc2tpcCA9IDQpICU+JQ0KICBzZWxlY3QoLWMoNDk6bmNvbCguKSkpICAlPiUgDQogIHJlbmFtZShhbmlvID0geWVhciwNCiAgICAgICAgIGlkc2VjdG9yID0gaWRyYW1hKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAicGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzZWN0b3IgPSBjYXNlX3doZW4oIHJhbWEgPT0gInBldHJvIiB+ICJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByYW1hID09ICJzZXJfcGV0cm8iIH4gInNlcnZpY2lvc19wZXRyb2xlcm9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByYW1hKSklPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGlkc2VjdG9yLCBzZWN0b3IsIGV2ZXJ5dGhpbmcoLiksIC1yYW1hKQ0KZGF0b3NfYWZpcA0KDQoNCnN0b2NrX2FmaXAgPC0gZGF0b3NfYWZpcCAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGlkc2VjdG9yLCBzZWN0b3IsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoS1RBID0gZGlzcG9uaWJpbGlkYWRlcyArIGJzY2FtYmlvICsgaW52ZW50YXJpb3MgKyBic3VzbywNCiAgICAgICAgICAgIHBweWUgPSBzdW0oYnN1c28sIG5hLnJtID0gVCksDQogICAgICAgICAgICBhY3Rpdm8gPSBzdW0oYWN0aXZvLCBuYS5ybSA9IFQpKSAlPiUNCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICBtdXRhdGUoS1RBID0gKEtUQS8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIHBweWU9IChwcHllLzEwXjYpIC8gaXBjXzE4LA0KICAgICAgICAgYWN0aXZvPSAoYWN0aXZvLzEwXjYpIC8gaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIGFycmFuZ2UoaWRzZWN0b3IpICU+JSANCiAgZmlsdGVyKHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInNlcnZpY2lvc19wZXRyb2xlcm9zIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWMoaWRzZWN0b3IsIGlwY18xOCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBtdXRhdGUoZnVlbnRlID0gIkFGSVAiKQ0Kc3RvY2tfYWZpcA0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyANCiMgTWVtb3JpYXMgWVBGIA0KYmFsYW5jZV95cGYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9FeGNlbHMgZGUgQmV0YW5pYS9DYWxjdWxvcyBCZXRhbmlhIFRnLnhscyIsIA0KICAgIHNoZWV0ID0gIllQRl9BICRIT1lfUEFSQURFRkxBQ1lDQUxDVUxBUiIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIHNlbGVjdCgtYygxMjpuY29sKC4pKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIHVuaWRhZCA9IG1vbmVkYSwNCiAgICAgICAgIHZlbnRhcyA9ICJWZW50YXMuLi4zIiwNCiAgICAgICAgIGNvc3RvX3ZlbnRhcyA9ICJDb3N0byBkZSBsYXMgVmVudGFzLi4uNCIsDQogICAgICAgICB1dGlsaWRhZF9uZXRhID0gIlV0aWxpZGFkIG5ldGEiLA0KICAgICAgICAgdXRpbGlkYWRfb3BlcmF0aXZhID0gIlV0aWxpZGFkIG9wZXJhdGl2YSIsDQogICAgICAgICBwcHllID0gIkJzIFVzbyIsDQogICAgICAgICBiaWVuZXNfZGVfY2FtYmlvID0gIkJzIENhbWJpbyIsDQogICAgICAgICB1dGlsaWRhZF9uZXRhX2FudGVzX2ltcHVlc3RvcyA9ICJVTiBhbnRlcyBkZSBpbXB1ZXN0b3MgKGfCtCBhY3Rpdm9zIHkgZGl2aWRlbmRvcykiLA0KICAgICAgICAgYWN0aXZvID0gIkFjdGl2byBUb3RhbCIsDQogICAgICAgICBwYXRyaW1vbmlvX25ldG8gPSAiUGF0cmltb25pbyBOZXRvIikgJT4lDQogIGZpbHRlcighKGlzLm5hKGFuaW8pKSkgJT4lDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF42fSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAgZGUgMjAxOCIsDQogICAgICAgICB2ZW50YXMgPXZlbnRhcy9pcGNfMTgsDQogICAgICAgICBjb3N0b192ZW50YXMgPSBjb3N0b192ZW50YXMvaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfbmV0YSA9IHV0aWxpZGFkX25ldGEvaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfb3BlcmF0aXZhID0gdXRpbGlkYWRfb3BlcmF0aXZhL2lwY18xOCwNCiAgICAgICAgIHBweWUgPSBwcHllL2lwY18xOCwNCiAgICAgICAgIGJpZW5lc19kZV9jYW1iaW8gPSBiaWVuZXNfZGVfY2FtYmlvL2lwY18xOCwNCiAgICAgICAgIHV0aWxpZGFkX25ldGFfYW50ZXNfaW1wdWVzdG9zID0gdXRpbGlkYWRfbmV0YV9hbnRlc19pbXB1ZXN0b3MvaXBjXzE4LA0KICAgICAgICAgYWN0aXZvID0gYWN0aXZvL2lwY18xOCwNCiAgICAgICAgIHBhdHJpbW9uaW9fbmV0byA9IHBhdHJpbW9uaW9fbmV0by9pcGNfMTgsDQogICAgICAgICBLVEEgPSBwcHllICsgYmllbmVzX2RlX2NhbWJpbywNCiAgICAgICAgIHNlY3RvciA9ICJNZW1vcmlhIGRlIFlQRiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHNlY3RvciwgdW5pZGFkLCBldmVyeXRoaW5nKC4pKSANCmJhbGFuY2VfeXBmDQoNCnN0b2NrX3lwZiA8LSBiYWxhbmNlX3lwZiAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJhY3Rpdm8iLCAicHB5ZSIpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGNhc2Vfd2hlbihhbmlvID09IDE5ODMgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg1IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4NiB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODcgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg4IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvcikpICU+JQ0KICBiaW5kX3Jvd3Moc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgc2VsZWN0KGFuaW8sICBzZWN0b3IgPWVtcHJlc2EsIHVuaWRhZCwgdmFyaWFibGUsIHZhbG9yICkgJT4lIA0KICAgIGZpbHRlcihzZWN0b3IgPT0gIllQRiIsDQogICAgICAgICAgIHZhcmlhYmxlICAlaW4lIGMoIktUQSIsICJhY3Rpdm8iLCAicHB5ZSIpKSkNCiAgDQoNCmBgYA0KDQojIyMgU3RvY2sgdG90YWwgZGUgbGEgcmFtYSANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFN0b2NrIGRlIGxhIHJhbWENCnN0b2NrX3JhbWEgPC0gc3RvY2tfYWZpcCAlPiUgDQogIGJpbmRfcm93cyhzdG9ja19iYWxhbmNlc19yYW1hKQ0KDQojIHdyaXRlLmNzdihzdG9ja19yYW1hLCBmaWxlID0iL0FyY2hpdm9zL0RhdG9zL1N0b2NrL3N0b2NrX2hpZHJvY2FyYnVyb3MuY3N2IikNCg0KDQpncmFmX3N0b2NrX3JhbWEgPC0gc3RvY2tfcmFtYSAlPiUgDQogICMgbXV0YXRlKHZhbG9yID0gbnVtYmVyX2Zvcm1hdCh2YWxvciwgYmlnLm1hcmsgPSAiICIgKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBzZWN0b3IsIHNoYXBlID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KHNpemUgPSAuOCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8geSBhY3Rpdm8gZGUgc2VnbWVudG9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdWJzZWN0b3JlcyBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBmYWNldF93cmFwKH4gdmFyaWFibGUgKQ0KDQpnZ3Bsb3RseShncmFmX3N0b2NrX3JhbWEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQojIyMgU3RvY2sgZGUgc2VnbWVudG9zIGRlIFlQRiB5IFBldHJvYnJhcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfc3RvY2tfc2VnbWVudG9zIDwtIHVuaW9uX3NlZ21lbnRvcyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrDQogIGdlb21fbGluZSgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiU3RvY2sgZGUgY2FwaXRhbCBkZSBzZWdtZW50b3MiLA0KICAgICAgIHN1YnRpdGxlID0gIllQRiB5IFBldHJvYnJhcyBBcmdlbnRpbmEiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIGZhY2V0X3dyYXAodmFyaWFibGUgfiBlbXByZXNhICkNCg0KZ2dwbG90bHkoZ3JhZl9zdG9ja19zZWdtZW50b3MsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCg0KYGBgDQoNCiMjIyBTdG9jayBwb3IgZW1wcmVzYXMNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9zdG9ja19lbXAgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIGZpbHRlcigNCiAgICAjIHZhcmlhYmxlICVpbiUgYygiS1RBIiwgImFjdGl2byIpLA0KICAgICAgICAgc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIHBvciBlbXByZXNhIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl9zdG9ja19lbXAsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCg0KYGBgDQoNCiMjIyBZUEYgbGFyZ28gcGxhem8NCkNvbXBhcmFjacOzbiBlbnRyZSBsYSBNZW1vcmlhIFlQRiAocmVjb3BpbGFkbyBwb3IgQkZSKSB5IGxvcyBiYWxhbmNlcyBleHRyw61hZG9zIGRlIEJvbHNhcg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9zdG9ja195cGYgPC0gIHN0b2NrX3lwZiAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgZGUgWVBGIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl9zdG9ja195cGYsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCmBgYA0KDQojIyMgRXN0aW1hY2nDs24gZGUgc3RvY2sgZGUgY2FwaXRhbCBhIHBhcnRpciBkZSBsYSBldm9sdWNpw7NuIGRlIHBvem9zIHBlcmZvcmFkb3MNCg0KDQpFbCBlamVyY2ljaW8gY29uc2lzdGUgZW4gdmVyaWZpY2FyIHNpIGxvcyBwb3pvcyB0ZXJtaW5hZG9zIHNpcnZlbiBjb21vIGluZGljYWRvciBkZSBsYSBpbnZlcnNpw7NuIHksIHBvciBsbyB0YW50bywgZGUgYXByb3hpbWFkb3IgYWwgc3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvLiBQYXJhIGVsbG8gc2UgcGFydGUgZGUgdW4gYcOxbyBiYXNlIGRlIGxhIHNlcmllIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvIGRlbCBzZWN0b3IgZXh0cmFjY2nDs24gZGUgQm9sc2FyIHkgQUZJUCwgcGFyYSBsdWVnbyBpbmRleGFyIGxhcyB2YXJpYWJsZXMgcG9yIGxhIGV2b2x1Y2nDs24gZGUgbG9zIHBvem9zLiBMb3MgYmFsYW5jZXMgZGUgQm9sc2FyIHF1ZSBjb3JyZXNwb25kZW4gw7puaWNhbWVudGUgYSBleHRyYWNjacOzbiBzb24gZG9zOiBQQUUgeSBUZWNwZXRyb2wsIHBvciBsbyBxdWUgZWwgdmFsb3Igb2J0ZW5pZG8gcHVlZGUgZXN0YXIgc3VicmVwcmVzZW50YWRvIHBhcmEgZGFyIGN1ZW50YSBkZWwgdG90YWwgZGUgbGEgcmFtYS4gQ29uIHJlc3BlY3RvIGFsIMOtbmRpY2UgZGUgcG96b3MsIHNlIHRvbWFyb24gZG9zIHNlcmllcyBhbHRlcm5hdGl2YXM6IHVuYSBjb25zdHJ1w61kYSBhIHBhcnRpciBkZWwgc3RvY2sgZGUgcG96b3MgZW4gZXh0cmFjY2nDs24gZWZlY3RpdmEgKGZ1ZW50ZTogSUFQRykgeSBvdHJhIGVsYWJvcmFkYSBjb24gbG9zIHBvem9zIHRlcm1pbmFkb3MgYW51YWxlcyBjYXJnYWRvcyBwb3IgZW1wcmVzYSBvcGVyYWRvcmEgKGZ1ZW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEpLiAgDQoNCkVsIGHDsW8gYmFzZSBlbGVnaWRvIGVzIDIwMDYsIGRhZG8gcXVlIGVzIGVsIMO6bHRpbW8gZGF0byBxdWUgcG9zZWVtb3MgZGVsIHN0b2NrIGRlIHBvem9zIHRvdGFsZXMgZW4gYWN0aXZpZGFkIGRlIElBUEcuDQoNClNlIHJlYWxpesOzIGxhIG1pc21hIGVzdGltYWNpw7NuIHBhcmEgWVBGLCBmaWx0cmFuZG8gbGFzIHZhcmlhYmxlcyBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyAocGFyYSBlbCB0b3RhbCBkZSBsYSBlbXByZXNhLCBwb3IgbG8gcXVlIGluY2x1eWUgbm8gc8OzbG8gZXh0cmFjY2nDs24gc2lubyByZWZpbmFjacOzbiB5IG90cm9zIHJ1YnJvcykgeSBhY3Rpdm8gdG90YWwgZGVsIHVwc3RyZWFtLiBTZSB1dGlsaXrDsyDDum5pY2FtZW50ZSBlbCBpbmRpY2UgZGUgcG96b3MgdGVybWluYWRvcyBhbnVhbGVzIGRlIFlQRiBwYXJhIGVzdGltYXIgbGEgUFB5RSB5IGVsICBhY3Rpdm8sIGRhZG8gcXVlIG5vIHNlIHBvc2VlIHZhbG9yZXMgZGVsIHN0b2NrIGRlIHBvem9zIGVuIHBlcmZvcmFjacOzbiBwYXJhIGxvcyBhw7FvcyBlbiBkb25kZSBleGlzdGVuIHZhbG9yZXMgY29udGFibGVzIHF1ZSBzaXJ2YW4gZGUgYcOxbyBiYXNlLiBMdWVnbywgc2UgZXN0aW3DsyB1biBzdG9jayBkZSBjYXBpdGFsIHRvdGFsIGRlIHJhbWEgYSBwYXJ0aXIgZGUgcG9uZGVyYXIgZWwgc3RvY2sgZGUgWVBGIHBvciBsYSByZWxhY2nDs24gZW50cmUgbG9zIHBvem9zIGRlIFlQRiB5IGxvcyBwb3pvcyB0b3RhbGVzIGRlIGxhIHJhbWEuDQoNCg0KRW4gc8OtbnRlc2lzLCBlbCBsaXN0YWRvIGRlIHZhcmlhYmxlcyBlc3RpbWFkYXMtIGEgcGFydGlyIGRlIGxhcyBkb3Mgc2VyaWVzIGRlIHBvem9zIChzdG9jayB5IGZsdWpvKSxzYWx2byBwYXJhIGxhIGVzdGltYWNpw7NuIGRlIFlQRiBxdWUgc29sbyBzZSBwdWRvIGhhY2VyIGNvbiBmbHVqbyBkZSBwb3pvcyBwb3IgYXVzZW5jaWEgZGUgaW5mb3JtYWNpw7NuLSBlcyBsYXMgc2lndWllbnRlczoNCg0KKiAkcHB5ZVxfZXN0aW1hZG9cX2JvbHNhciQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIEJvbHNhciQgKiAkaW5kaWNlXCBkZVwgcG96b3MkDQoqICRwcHllXF9lc3RpbWFkb1xfYWZpcCQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIEFGSVAkICogJGluZGljZVwgZGVcIHBvem9zJA0KDQoqICRwcHllXF9lc3RpbWFkb1xfeXBmJCA9ICRQUHlFXCBhw7FvXCBiYXNlXCBkZVwgWVBGJCAqICRpbmRpY2VcIGRlXCBwb3pvc1wgWVBGJA0KKiAkYWN0aXZvXF9lc3RpbWFkb1xfdXBzdHJlYW1cX3lwZiQgPSAkQWN0aXZvXCBhw7FvXCBiYXNlXCBkZVwgWVBGJCAqICRpbmRpY2VcIGRlXCBwb3pvc1wgWVBGJA0KDQoqICRwcHllXF9lc3RpbWFkb1xfdG90YWwkID0gJHBweWVcX2VzdGltYWRvXF95cGYkICogJCRcZnJhY3twb3pvc1wgdG90YWxlc317cG96b3NcIGRlXCBZUEZ9JCQNCg0KKiAkYWN0aXZvXF9lc3RpbWFkb1xfdXBzdHJlYW0kID0gJGFjdGl2b1xfZXN0aW1hZG9cX3Vwc3RyZWFtXF95cGYkICAqICQkXGZyYWN7cG96b3NcIHRvdGFsZXN9e3Bvem9zXCBkZVwgWVBGfSQkDQoNClBhcmEgcG9kZXIgc2VsZWNjaW9uYXIgbGEgZXN0aW1hY2nDs24gbcOhcyBhZGVjdWFkYSwgc2UgcmVhbGl6w7MgdW4gYW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBlbnRyZSB0b2RhcyBsYXMgc2VyaWVzIGVzdGltYWRhcyB5IGxvcyB2YWxvcmVzIGNvbnRhYmxlcyBxdWUgc2UgcG9zZWVuIGRlIFBQeUUgZGUgQUZJUCwgQm9sc2FyIGUgWVBGLiBTZSBwcmVzZW50YW4gZGlzdGludG9zIGN1YWRyb3MgZGUgY29ycmVsYWNpb25lcywgY29uIHN1cyBuaXZsZXMgZGUgc2lnbmlmaWNhbmNpYSwgZGlhZ3JhbWFzIGRlIGRpc3BlcnNpw7NuIGVudHJlIHZhcmlhYmxlcyB5IHN1IGRpc3RyaWJ1Y2nDs24uIExhcyBzZXJpZXMgY29uc3RydcOtZGFzIHF1ZSBwb3NlZW4gbWVqb3IgY29ycmVsYWNpw7NuIHNvbiBsYSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBhIHBhcnRpciBkZSBCb2xzYXIgZXN0aW1hZGFzIGNvbiDDrW5kaWNlIGRlIHN0b2NrIGRlIHBvem9zIChjb3JyZWxhY2nDs24gZnVlcnRlIGRlIDAuODkgeSBzaWduaWZpY2F0aXZhIGFsIDAuMDAxKSB5IGZsdWpvIGRlIHBvem9zIChjb3JyZWxhY2nDs24gbW9kZXJhZGEgZGUgMC41NCB5IHNpZ25pZmljYXRpdmEgYWwgMC4wNSkgeSBsdWVnbyBlbCBhY3Rpdm8gZGVsIHVwc3RyZWFtIHRvdGFsIGRlIGxhIHJhbWEgYSBwYXJ0aXIgZGUgWVBGIChjb3JyZWxhY2nDs24gbW9kZXJhZGEgZGUgMC40MiB5IHNpZ25pZmljYXRpdmEgYWwgMC4xIGNvbiBsb3MgdmFsb3JlcyBjb250YWJsZXMgZGUgWVBGIHkgY29ycmVsYWNpw7NuIGZ1ZXJ0ZSBkZSAwLjg4IHkgc2lnbmlmaWNhdGl2YSBhbCAwLjAwMSBjb24gbGFzIGVzdGltYWNpb25lcyBkZSBQUHlFIGRlIEFGSVAgeSBCb2xzYXIgYSBwYXJ0aXIgZGUgZmx1am8gZGUgcG96b3MpLg0KDQpsYSBlc3RpbWFjacOzbiB0aWVuZSBxdWUgcmVhbGl6YXJzZSBjb24gUFB5RSBwb3JxdWUgaGF5IHF1ZSBleGNsdWlyIHNhbGFyaW9zIGUgaW52ZW50YXJpb3MgKHF1ZSBlc3TDoW4gZW4gS1RBKQ0KDQojIyMjIEFuw6FsaXNpcyBkZSBjb3JyZWxhY2lvbiBlbnRyZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyB5IFBvem9zIGVuIHByb2R1Y2Npw7NuDQoNCg0KcmVlbXBsYXphciBpcGMgcG9yIHVuIGliaWYgbyBpbmRpY2UgZXNwZWNpZmljbw0KDQojIyMjIyBUb3RhbCByYW1hDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpzdG9ja195X3Bvem9zX3Rhc2FzIDwtIHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHZhbG9yLGZ1ZW50ZSkgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzcHJlYWQoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIG11dGF0ZShBRklQID0gdmFyaWFjaW9uX2ludGVyYW51YWwoQUZJUCksDQogICAgICAgICBCb2xzYXIgPSB2YXJpYWNpb25faW50ZXJhbnVhbChCb2xzYXIpKSAlPiUgDQogIGZ1bGxfam9pbihjb21wYXJhY2lvbl9wb3pvcyANCiAgICAgICAgICAgICU+JQ0KICAgICAgICAgICAgIyBzZWxlY3QoLSBwb3pvc19wZXJmb3JhZG9zX2lhcGcpDQogICAgICAgICAgICBzZWxlY3QoLSBwb3pvc192YXJpYWNpb25faWFwZykNCiAgICAgICAgICAgICwgYnkgPSAiYW5pbyIpICU+JQ0KICByZW5hbWUocHB5ZV9hZmlwID0gQUZJUCwNCiAgICAgICAgIHBweWVfYm9sc2FyID0gQm9sc2FyLA0KICAgICAgICAgcG96b3NfaWFwZyA9IHBvem9zX3BlcmZvcmFkb3NfaWFwZywNCiAgICAgICAgICMgcG96b3NfaWFwZ19jZW50ZW5hcmlvID0gcG96b3NfdmFyaWFjaW9uX2lhcGcsDQogICAgICAgICBwb3pvc190ZXJtaW5hZG9zID0gcG96b3NfdGVybWluYWRvc19zZWNfZW5lcmdpYSwNCiAgICAgICAgIHBvem9zX2NhcmdhZG9zID0gcG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvID4gMTk5OCkgJT4lDQogIHNlbGVjdCgtYW5pbykgJT4lDQogIG11dGF0ZV9hbGwodGFzYV9jcmVjaW1pZW50bykgIA0KICANCg0KDQpHR2FsbHk6OmdncGFpcnMoc3RvY2tfeV9wb3pvc190YXNhcywgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHN0b2NrX3lfcG96b3NfdGFzYXMpDQoNCiMgcm91bmQodmFyKHN0b2NrX3lfcG96b3NfdGFzYXMsIG5hLnJtID0gVFJVRSksIDQpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojbWF0cml6IGRlIGNvcnJlbGFjaW9uDQpjb3JfcG96b3MgPC0gY29yKHN0b2NrX3lfcG96b3NfdGFzYXMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KY29yX3Bvem9zDQoNCiMgIGRpc3RpbnRvcyBjb3JyZWxvZ3JhbWFzDQojY29uIGdnY29ycnBsb3QNCmxpYnJhcnkoZ2djb3JycGxvdCkNCnAubWF0ID0gY29yX3BtYXQoc3RvY2tfeV9wb3pvc190YXNhcykNCmdnY29ycnBsb3QoY29yX3Bvem9zLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCiMgIyAjY29uIGNvcnJwbG90DQojIGNvbCA8LSBjb2xvclJhbXBQYWxldHRlKGMoIiNCQjQ0NDQiLCAiI0VFOTk4OCIsICIjRkZGRkZGIiwgIiM3N0FBREQiLCAiIzQ0NzdBQSIpKQ0KIyBjb3JycGxvdDo6Y29ycnBsb3QoY29yX3Bvem9zLCBtZXRob2Q9ImNvbG9yIiwgY29sPWNvbCgyMDApLA0KIyAgICAgICAgICB0eXBlPSJ1cHBlciIsIG9yZGVyPSJoY2x1c3QiLA0KIyAgICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIsICMgQWRkIGNvZWZmaWNpZW50IG9mIGNvcnJlbGF0aW9uDQojICAgICAgICAgIHRsLmNvbD0iYmxhY2siLCB0bC5zcnQ9NDUsICNUZXh0IGxhYmVsIGNvbG9yIGFuZCByb3RhdGlvbg0KIyAgICAgICAgICAjIENvbWJpbmUgd2l0aCBzaWduaWZpY2FuY2UNCiMgICAgICAgICAgIyBwLm1hdCA9IHAubWF0LA0KIyAgICAgICAgICAjIGluc2lnID0gImJsYW5rIiwNCiMgICAgICAgICAgc2lnLmxldmVsID0gMC4wMSkNCg0KIyAjICNjb24gZ2dnYWxseQ0KIyBHR2FsbHk6OmdnY29ycihzdG9ja195X3Bvem9zX3Rhc2FzLCBtZXRob2QgPSBjKCJjb21wbGV0ZS5vYnMiLCAicGVhcnNvbiIpICwNCiMgICAgICAgICAgICAgICAgbGFiZWwgPSBULCBsYWJlbF9yb3VuZCA9IDIpDQpgYGANCg0KYGBge3J9DQojYcOxb3MgYmFzZSAyMDA2DQpwcHllX2FuaW9fYmFzZV9ib2xzYXIgPC0gKHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yID09ICJwcm9kdWNjaW9uIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHBweWUgPSB2YWxvcikpDQpwcHllX2FuaW9fYmFzZV9ib2xzYXIgPC0gcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyJHBweWVbcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyJGFuaW8gPT0yMDA2XQ0KDQojIHZhbG9yX2Jhc2UgPC0gc2VyaWVbd2hpY2goZmVjaGE9PWZlY2hhX2Jhc2UpXQ0KDQpwcHllX2FuaW9fYmFzZV9hZmlwIDwtIChzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciA9PSAiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHB5ZSA9IHZhbG9yKSkNCnBweWVfYW5pb19iYXNlX2FmaXAgPC0gcHB5ZV9hbmlvX2Jhc2VfYWZpcCRwcHllW3BweWVfYW5pb19iYXNlX2FmaXAkYW5pbyA9PSAyMDA2XQ0KDQoNCnN0b2NrX3lfcG96b3MgPC0gIGNvbXBhcmFjaW9uX3Bvem9zICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZV9wb3pvLA0KICAgICAgICAgdmFsdWUgPSBjYW50aWRhZF9wb3pvcywNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIGFycmFuZ2UoZnVlbnRlX3Bvem8sYW5pbykgJT4lIA0KICBncm91cF9ieShmdWVudGVfcG96bykgJT4lIA0KICBtdXRhdGUoaW5kaWNlX3Bvem9zXzA2ID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IGNhbnRpZGFkX3Bvem9zICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDYpKSAlPiUgDQogICMgbGVmdF9qb2luKHN0b2NrX3JhbWEgJT4lICANCiAgIyAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHB5ZSA9IHZhbG9yLCBmdWVudGVfc3RvY2sgPSBmdWVudGUpLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocHB5ZV9hZmlwID0gcHB5ZV9hbmlvX2Jhc2VfYWZpcCAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIHBweWVfYm9sc2FyID1wcHllX2FuaW9fYmFzZV9ib2xzYXIgKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZV9wcHllLA0KICAgICAgICAgdmFsdWUgPSBwcHllX2VzdGltYWRvLA0KICAgICAgICAgNTo2KQ0Kc3RvY2tfeV9wb3pvcw0KDQpnZ3Bsb3RseShzdG9ja195X3Bvem9zICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLHBweWVfZXN0aW1hZG8gLCBjb2xvciA9IGZ1ZW50ZV9wb3pvKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHk9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofmZ1ZW50ZV9wcHllICAgICksDQogICAgd2lkdGggPSA4MDAsIGxlbmd0aCA9NTAwKQ0KDQpzdG9ja19lc3RpbWFkbyA8LSBzdG9ja195X3Bvem9zICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKGZ1ZW50ZV9wb3pvID09InBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhIiwgZnVlbnRlX3BweWUgPT0icHB5ZV9ib2xzYXIiKSAlPiUgDQogIHJlbmFtZSh1bmlkYWQgPSB1bmlkYWRfcHB5ZSwgdmFsb3IgPXBweWVfZXN0aW1hZG8pICU+JSANCiAgc2VsZWN0KC1jKGNhbnRpZGFkX3Bvem9zLCBpbmRpY2VfcG96b3NfMDYsIGZ1ZW50ZV9wb3pvKSkNCg0KYGBgDQoNCg0KIyMjIyMjIFN0b2NrIGRlIHBvem9zDQpgYGB7cn0NCnN0b2NrX3lfcG96b3NfdGFzYXNfdjIgPC0gc3RvY2tfcmFtYSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBzZWN0b3IgJWluJSBjKCJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsICJwcm9kdWNjaW9uIikpICU+JQ0KICBzZWxlY3QoYW5pbywgdmFsb3IsZnVlbnRlKSAlPiUNCiAgc3ByZWFkKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvcikgJT4lIA0KICBmdWxsX2pvaW4ocG96b3NfaWFwZ19jZW50ZW5hcmlvJT4lDQogICAgICAgICAgICBzZWxlY3QoYW5pbywgcG96b3NfaWFwZyA9IHRvdGFsZXMgKSwgYnkgPSAiYW5pbyIpICU+JQ0KICByZW5hbWUocHB5ZV9hZmlwID0gQUZJUCwNCiAgICAgICAgIHBweWVfYm9sc2FyID0gQm9sc2FyICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5OTgpICU+JQ0KICBzZWxlY3QoLWFuaW8pICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pICANCiAgDQoNCg0KR0dhbGx5OjpnZ3BhaXJzKHN0b2NrX3lfcG96b3NfdGFzYXNfdjIsIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gInNtb290aCIpKQ0KcGxvdChzdG9ja195X3Bvem9zX3Rhc2FzX3YyKQ0KDQojIHJvdW5kKHZhcihzdG9ja195X3Bvem9zX3Rhc2FzLCBuYS5ybSA9IFRSVUUpLCA0KQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KI21hdHJpeiBkZSBjb3JyZWxhY2lvbg0KY29yX3Bvem9zIDwtIGNvcihzdG9ja195X3Bvem9zX3Rhc2FzX3YyLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvcw0KDQojICBkaXN0aW50b3MgY29ycmVsb2dyYW1hcw0KI2NvbiBnZ2NvcnJwbG90DQpsaWJyYXJ5KGdnY29ycnBsb3QpDQpwLm1hdCA9IGNvcl9wbWF0KHN0b2NrX3lfcG96b3NfdGFzYXMpDQpnZ2NvcnJwbG90KGNvcl9wb3pvcywgaGMub3JkZXIgPSBUUlVFLA0KICAgIHR5cGUgPSAibG93ZXIiLCBwLm1hdCA9IHAubWF0LCBsYWIgPSBUKQ0KDQojICMgI2NvbiBjb3JycGxvdA0KIyBjb2wgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCIjQkI0NDQ0IiwgIiNFRTk5ODgiLCAiI0ZGRkZGRiIsICIjNzdBQUREIiwgIiM0NDc3QUEiKSkNCiMgY29ycnBsb3Q6OmNvcnJwbG90KGNvcl9wb3pvcywgbWV0aG9kPSJjb2xvciIsIGNvbD1jb2woMjAwKSwNCiMgICAgICAgICAgdHlwZT0idXBwZXIiLCBvcmRlcj0iaGNsdXN0IiwNCiMgICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCAjIEFkZCBjb2VmZmljaWVudCBvZiBjb3JyZWxhdGlvbg0KIyAgICAgICAgICB0bC5jb2w9ImJsYWNrIiwgdGwuc3J0PTQ1LCAjVGV4dCBsYWJlbCBjb2xvciBhbmQgcm90YXRpb24NCiMgICAgICAgICAgIyBDb21iaW5lIHdpdGggc2lnbmlmaWNhbmNlDQojICAgICAgICAgICMgcC5tYXQgPSBwLm1hdCwNCiMgICAgICAgICAgIyBpbnNpZyA9ICJibGFuayIsDQojICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDEpDQoNCiMgIyAjY29uIGdnZ2FsbHkNCiMgR0dhbGx5OjpnZ2NvcnIoc3RvY2tfeV9wb3pvc190YXNhcywgbWV0aG9kID0gYygiY29tcGxldGUub2JzIiwgInBlYXJzb24iKSAsDQojICAgICAgICAgICAgICAgIGxhYmVsID0gVCwgbGFiZWxfcm91bmQgPSAyKQ0KYGBgDQoNCg0KIyMjIyMgWVBGDQpgYGB7cn0NCnBweWVfeXBmIDwtIHlwZl9zZWcgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICA9PSAidXBzdHJlYW0iICkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgaXBjXzE4KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHZhcmlhYmxlID0gImFjdGl2b191cHN0cmVhbV95cGYiLA0KICAgICAgICAgYWN0aXZvcyA9IGFjdGl2b3MvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIHVuaWRhZCAsICBhY3Rpdm9fdXBzdHJlYW09IGFjdGl2b3MpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBlbXByZXNhID09ICJZUEYiKSAlPiUNCiAgICBzZWxlY3QoYW5pbywgZW1wcmVzYSwgdW5pZGFkLCBwcHllX2ludGVncmFkYSA9dmFsb3IpICwgYnkgPSBjKCJhbmlvIiwgImVtcHJlc2EiLCAidW5pZGFkIikpICU+JSANCiAgbXV0YXRlKGFjdGl2b191cHN0cmVhbSA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKGFjdGl2b191cHN0cmVhbSksDQogICAgICAgICBwcHllX2ludGVncmFkYSA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKHBweWVfaW50ZWdyYWRhKSkgJT4lIA0KICBmdWxsX2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KC1lbXByZXNhKSAlPiUgDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihpZGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIGVtcHJlc2EgPSBpZGVtcHJlc2EpLCBieSA9IGMoImFuaW8iLCAiZW1wcmVzYSIpICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQpwcHllX3lwZg0KDQpwcHllX3lwZl90YXNhcyA8LSBwcHllX3lwZiAlPiUNCiAgIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvICVpbiUgMTk5ODoyMDE4KSAlPiUNCiAgc2VsZWN0KC1jKGFuaW8sIGVtcHJlc2EsIHVuaWRhZCkpICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pDQoNCiNtYXRyaXogZGUgY29ycmVsYWNpb24NCmNvcl9wb3pvc195cGYgPC0gY29yKHBweWVfeXBmX3Rhc2FzLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvc195cGYNCg0KIyAgZGlzdGludG9zIGNvcnJlbG9ncmFtYXMNCiNjb24gZ2djb3JycGxvdA0KcC5tYXQgPSBjb3JfcG1hdChjb3JfcG96b3NfeXBmKQ0KZ2djb3JycGxvdChjb3JfcG96b3NfeXBmLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCkdHYWxseTo6Z2dwYWlycyhwcHllX3lwZl90YXNhcywgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHBweWVfeXBmX3Rhc2FzKQ0KYGBgDQoNCg0KYGBge3J9DQojYcOxb3MgYmFzZXMNCmFuaW9fYmFzZV95cGZfc2VnbWVudG8gPC0gICBwcHllX3lwZiRhY3Rpdm9fdXBzdHJlYW1bcHB5ZV95cGYkYW5pbyA9PSAyMDA2XQ0KDQphbmlvX2Jhc2VfeXBmX2JvbHNhciA8LSBwcHllX3lwZiRwcHllX2ludGVncmFkYVtwcHllX3lwZiRhbmlvID09IDIwMDZdDQoNCg0Kc3RvY2tfeV9wb3pvc195cGYgPC0gIHBweWVfeXBmICU+JSANCiAgbXV0YXRlKGluZGljZV9wb3pvc18wNiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBwb3pvcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA2KSkgJT4lIA0KICBtdXRhdGUocHB5ZV95cGZfZXN0aW1hZG8gPSBhbmlvX2Jhc2VfeXBmX2JvbHNhciAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIGFjdGl2b195cGZfZXN0aW1hZG8gPWFuaW9fYmFzZV95cGZfc2VnbWVudG8gKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpDQoNCnN0b2NrX3lfcG96b3NfeXBmICU+JQ0KICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3BweWUsIHBweWVfeXBmX2VzdGltYWRvLCBhY3Rpdm9feXBmX2VzdGltYWRvKSAlPiUNCiAgICAgICAgICAgZ2F0aGVyKGtleSA9IGVzdGltYWNpb24sDQogICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAgICAgICAgICAgMzo0KSAlPiUgDQogICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSBkZSBZUEYgYSBwYXJ0aXIgZGUgaW5kaWNlIGRlIHBvem9zIikNCmBgYA0KDQojIyMjIyMgUFB5RSB5IGFjdGl2byB1cHN0cmVhbSB0b3RhbCByYW1hIGEgcGFydGlyIGRlIFlQRg0KDQpgYGB7cn0NCnBvem9zX3lmcF9zb2JyZV90b3RhbCA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9IGFuaW9fdGVybWluYWNpb25fcG96bykgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkgJT4lIA0KICBsZWZ0X2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGlkZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3lwZiA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkpICU+JSANCiAgbXV0YXRlKHlwZl9zb2JyZV90b3RhbCA9IHBvem9zX2NhcmdhZG9zX3lwZi9wb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSkNCiMgcG96b3NfeWZwX3NvYnJlX3RvdGFsDQoNCmVzdGltYWNpb25fcHB5ZV90b3RhbF92aWFfeXBmIDwtIHN0b2NrX3lfcG96b3NfeXBmICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcHllLCBwcHllX3lwZl9lc3RpbWFkbywgYWN0aXZvX3lwZl9lc3RpbWFkbykgJT4lIA0KICBnYXRoZXIoa2V5ID0gZXN0aW1hY2lvbiwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgMzo0KSAlPiUgDQogIGxlZnRfam9pbihwb3pvc195ZnBfc29icmVfdG90YWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgeXBmX3NvYnJlX3RvdGFsKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvci95cGZfc29icmVfdG90YWwsDQogICAgICAgICAgZXN0aW1hY2lvbiA9IGNhc2Vfd2hlbihlc3RpbWFjaW9uID09ICJwcHllX3lwZl9lc3RpbWFkbyIgfiAicHB5ZV9lc3RpbWFkb190b3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWFjaW9uID09ICJhY3Rpdm9feXBmX2VzdGltYWRvIiB+ICJhY3Rpdm9fZXN0aW1hZG9fdXBzdHJlYW0iICkpDQogIA0KZXN0aW1hY2lvbl9wcHllX3RvdGFsX3ZpYV95cGYgJT4lDQogICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSB0b3RhbCBhIHBhcnRpciBkZSBhbXBsaWFjacOzbiBkZSBwb3pvcyBZUEYiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQojIyBJbnZlcnNpb25lcw0KDQpGdWVudGVzOiANCg0KKiBCYWxhbmNlcyBkZSBCb2xzYXIuIEludmVyc2nDs24gY2FsY3VsYWRhIGEgcGFydGlyIGRlIHZhcmlhY2lvbmVzIGRlbCBhY3Rpdm8gKyBjb25zdW1vIGRlIGNhcGl0YWwgZmlqbyAoZXN0byDDumx0aW1vIGVzdMOhIHBlbmRpZW50ZSkNCiogU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYS4gUmVzb2x1Y2nDs24gMjA1NyANCiAgKyBbSW52ZXJzaW9uZXMgcmVhbGl6YWRhcyBhw7FvIGFudGVyaW9yXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvaW52ZXJzaW9uZXMtZW4tbWVyY2Fkby1kZS1oaWRyb2NhcmJ1cm9zLXVwc3RyZWFtL2FyY2hpdm8vMjg1ZDQ1ZTUtMWI4OC00ZGFlLThlNWMtYzAxODQzYzdjOGMwKQ0KICArIFtJbnZlcnNpb25lcyBhbnVhbGVzIHByZXZpc3RhcyBhIHJlYWxpemFyIGVuIGVsIGHDsW8gZGUgbGEgcHJlc2VudGFjacOzbiBkZSBsYSBEREpKXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvaW52ZXJzaW9uZXMtZW4tbWVyY2Fkby1kZS1oaWRyb2NhcmJ1cm9zLXVwc3RyZWFtKQ0KDQoNCjQpIGNvbnN0cnVpciBzZXJpZSBkZSBpbnZlcnNpw7NuIHBhcmEgYXRyYXMgKGJ1c2NhciBTdG9jayBkZSBZUEYgcGVybyBzb2xvIHBhcmEgZXh0cmFjY2nDs24pLiBhcm1hciBlamVyY2ljaW8gZGUgRkQgeSB2ZXIgc2kgbGFzIHByb3BvcmNpb25lcyBzZSBtYW50aWVuZW4uIA0KDQoqIFJlY29uc3RydWNjaW9uIGRlIHNlcmllIGRlIGludmVyc2lvbiBwb3IgZW1wcmVzYQ0KdmVyIHVuIGZsdWpvIGRlIHBvem9zIHkgdW4gZmx1am8gZGUgaW52ZXJzaW9uIHkgbHVlZ28gdmVyIHNpIGxvIHF1ZSBtdWV2ZSBsYSBpbnZlcnNpb24gc29uIGxvcyBwb3pvcyAocXVlIHN1IGV2b2x1Y2lvbiBzZWEgc2ltaWxhcikuIA0KDQotIGludmVyc2lvbiBwb3IgZW1wcmVzYSAoYmFsYW5jZTogdmFyaWFjaW9uIGRlbCBhY3Rpdm8gKyBjb25zdW1vIGRlIEsgZmlqbykNCi0gaW52ZXJzaW9uIHBvciBlbXByZXNhIChzZWNyZXRhcmlhIGRlIGVuZXJnaWEpDQotIGludmVyc2lvbiBhZ3JlZ2FkYSAodGlwbyBkZSBpbnZlcnNpb24pIChjdWVudGFzIG5hY2lvbmFsZXM/KQ0KLSBwb3pvcyBudWV2b3MgcG9yIGVtcHJlc2EgcG9yIGHDsW8NCi0gcG96b3MgbnVldm9zIHRvdGFsZXMNCi0gYXBsaWNhciBNSVAgcGFyYSBZUEYgDQoNCkludmVyc2nDs24gYSBwYXJ0aXIgZGUgQmFsYW5jZXMNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmludmVyc2lvbmVzX2VtcHJlc2EgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdCgtYyhmdWVudGUsIHNlY3RvcikpICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIikgJT4lDQogIGFycmFuZ2UoZW1wcmVzYSwgYW5pbykgJT4lIA0KICBncm91cF9ieSh1bmlkYWQsIHZhcmlhYmxlLCBlbXByZXNhKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gdmFyaWFjaW9uX2ludGVyYW51YWwodmFsb3IpKQ0KICAgDQojIGludmVyc2lvbmVzX2VtcHJlc2ENCg0KZ3JhZl9pbnZlcnNpb25lc19lbXByZXNhIDwtIGludmVyc2lvbmVzX2VtcHJlc2EgJT4lIA0KICBmaWx0ZXIoZW1wcmVzYSAhPSAiQ2FtdXp6aSBHYXMgUGFtcGVhbmEiKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBwb3IgZW1wcmVzYSIsDQogICAgICAgc3VidGl0bGUgPSAiQSBwYXJ0aXIgZGUgYmFsYW5jZXMiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiLA0KICAgICAgIGNhcHRpb24gPSAiQmFsYW5jZXMgZGUgZW1wcmVzYXMgZXh0cmHDrWRvcyBkZSBCb2xzYXIiKSsNCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUpDQojIGdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfZW1wcmVzYSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KYGBgDQoNCg0KSW52ZXJzacOzbiBhIHBhcnRpciBkZSBTZWNyZXRhcmlhIGRlIEVuZXJnw61hDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtYW8tYW50ZXJpb3IuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhgRmVjaGEgRmluIFRhcmVhc2AgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJWQvJW0vJVkiKSwgDQogICAgICAgIGBGZWNoYSBJbmljaW8gVGFyZWFzYCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlZC8lbS8lWSIpKSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIGRlIHByZXNlbnRhY2nDs24gZGUgbGEgRERKSiIsDQogICAgICAgICBlbXByZXNhID0gIkVtcHJlc2EgaW5mb3JtYW50ZSIsDQogICAgICAgICBjb25jZXB0byA9ICJEZXNjcmlwY2nDs24gZGVsIHBsYW4gZGUgYWNjacOzbiAoQ29uY2VwdG9zKSIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbiA9ICJDYW50LiBFeHBsb3JhY2lvbiIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3RhY2lvbiA9ICJDYW50LiBFeHBsb3RhY2lvbiIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbl9jb21wbGVtZW50YXJpYSA9ICJDYW50LiBFeHBsb3JhY2lvbiBDb21wbGVtZW50YXJpYSIsDQogICAgICAgICBleHBsb3JhY2lvbl9taWxsb25lc191c2QgPSAiTWlsbG9uZXMgdSRzIEV4cGxvcmFjaW9uIiwNCiAgICAgICAgIGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCA9ICJNaWxsb25lcyB1JHMgRXhwbG90YWNpb24iLA0KICAgICAgICAgZXhwbG9yYWNpb25fY29tcGxfbWlsbG9uZXNfdXNkID0gIk1pbGxvbmVzIHUkcyBFeHAuIENvbXBsZW1lbnRhcmlhIikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFuaW8gLSAxLA0KICAgICAgICAgZW1wcmVzYSA9Y2FzZV93aGVuKGVtcHJlc2EgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIGlkZW1wcmVzYSwgIGNvbmNlcHRvLA0KICAgICAgICAgY2FudGlkYWRfZXhwbG9yYWNpb24sIGNhbnRpZGFkX2V4cGxvdGFjaW9uLGNhbnRpZGFkX2V4cGxvcmFjaW9uX2NvbXBsZW1lbnRhcmlhLA0KICAgICAgICAgZXhwbG9yYWNpb25fbWlsbG9uZXNfdXNkLGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCwgZXhwbG9yYWNpb25fY29tcGxfbWlsbG9uZXNfdXNkICkgJT4lIA0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KGNvbmNlcHRvLCAncG96bycpKSAlPiUNCiAgZ3JvdXBfYnkoZW1wcmVzYSwgYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoaW52ZXJzaW9uX2V4cGxvdGFjaW9uID0gc3VtKGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCwgbmEucm0gPSBUKSkgJT4lIA0KICBhcnJhbmdlKC1pbnZlcnNpb25fZXhwbG90YWNpb24pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKQ0KaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvcg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlc29sdWNpbl8yMDU3X2ludmVyc2lvbmVzX3JlYWxpemFkYXNfbWVuc3VhbCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtbWVuc3VhbC5jc3YiKQ0KDQpyZXNvbHVjaW5fMjA1N19pbnZlcnNpb25lc19maW5fY29uY2VzaW9uPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvSW52ZXJzaW9uL1NlY3JldGFyaWEgZGUgRW5lcmdpYS9yZXNvbHVjaW4tMjA1Ny1pbnZlcnNpb25lcy1yZWFsaXphZGFzLWZpbi1kZS1jb25jZXNpbi5jc3YiKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmludmVyc2lvbmVzXzIwMDVfMjAxMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0ludmVyc2lvbi9TZWNyZXRhcmlhIGRlIEVuZXJnaWEvdGFibGFzIGRpbmFtaWNhcy9pbnZlcnNpb25lc18yMDA1XzIwMTIueGxzeCIsIA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpLCANCiAgICBza2lwID0gOCkgJT4lIA0KICByZW5hbWUocGxhbl8xcmFfc2VtYW5hID0gIlBsYW4gMcKqIFNlbS4iLA0KICAgICAgICAgcGxhbl9hbnVhbCA9ICJQbGFuIEFudWFsIiwNCiAgICAgICAgIHJlYWxpemFkb19hbnVhbCA9ICJSZWFsaXphZG8gQW51YWwiLA0KICAgICAgICAgY29uY2VwdG8gPSBDb25jZXB0bykgJT4lIA0KICBtdXRhdGUoYW5pbyA9ICB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBlbXByZXNhID0gIHpvbzo6bmEubG9jZihlbXByZXNhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgICAgZW1wcmVzYSA9Y2FzZV93aGVuKGVtcHJlc2EgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgZmlsdGVyKCEoZW1wcmVzYSAlaW4lIGMoIk8mRyBERVZFTE9QTUVOVFMgTFREIFMuQS4iICwiUEVUUk9NSU5FUkEgQ0hVQlVUIFMuRS4iKSkpICU+JQ0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KGNvbmNlcHRvLCAncG96bycpKSAlPiUNCiAgZ3JvdXBfYnkoZW1wcmVzYSwgYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShpbnZlcnNpb25fYW51YWwgPSBzdW0ocmVhbGl6YWRvX2FudWFsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGFycmFuZ2UoLWludmVyc2lvbl9hbnVhbCkNCmludmVyc2lvbmVzXzIwMDVfMjAxMg0KDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmdyYWZfaW52ZXJzaW9uZXNfMjAwNV8yMDEyIDwtICBpbnZlcnNpb25lc18yMDA1XzIwMTIgJT4lDQogIGdncGxvdChhZXMoYW5pbywgaW52ZXJzaW9uX2FudWFsLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EgKHRhYmxhcyBkaW5hbWljYXMpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJFeHRyYcOtZG8gZGUgdGFibGFzIGRpbsOhbWljYXMiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcmlhIGRlIEVuZXJnw61hIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfMjAwNV8yMDEyLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpncmFmX2ludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgPC0gIGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogIGdncGxvdChhZXMoYW5pbywgaW52ZXJzaW9uX2V4cGxvdGFjaW9uLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EgKGHDsW8gYW50ZXJpb3IpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgIGNhcHRpb24gPSAiU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpnZ3Bsb3RseShncmFmX2ludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA0NTApDQoNCmBgYA0KDQoNCiMjIyBBbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGVudHJlIEludmVyc2nDs24geSBQb3pvcw0KDQotIGJ1c2NhciBjb3JyZWxhY2lvbiwgcGFyYSB2ZXIgc2kgbGEgc2VyaWUgZGUgaW52ZXJzacOzbiBzZSBtdWV2ZSBzaW1pbGFyIGEgbG9zIHBvem9zDQotIHVzYXIgc3RvY2sgeSBhZGVtYXMgdXNhciB2YXJpYWNpb24gZGUgc3RvY2sgKGJzIGRlIHVzbykNCg0KQ29uIHBvem9zIGRlIElBUEcNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGNvbiBpbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3INCmludmVyc2lvbl9wb3pvcyA8LSBwb3pvc19pYXBnICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSwgYnkgPSBjKCJlbXByZXNhIiwgImFuaW8iKSkgJT4lIA0KICBtdXRhdGUoaW52ZXJzaW9uX3Bvcl9wb3pvID0gaW52ZXJzaW9uX2V4cGxvdGFjaW9uIC90b3RhbF9wb3pvcykNCg0KI2NvbiBpbnZlcnNpb25lcyBhbnVuY2lhZGFzDQppbnZlcnNpb25fcG96b3NfMiA8LSBwb3pvc19pYXBnICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzXzIwMDVfMjAxMiAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQogIG11dGF0ZShpbnZlcnNpb25fcG9yX3Bvem8gPSBpbnZlcnNpb25fYW51YWwgL3RvdGFsX3Bvem9zKQ0KDQojZXN0YSBtYWwgcHEgZXMgZmx1am8gZGUgcG96b3MgdnMgc3RvY2sgZGUgY2FwaXRhbA0KIyBrdGFfcG96b3MgPC0gcG96b3NfaWFwZyAlPiUgDQojICAgbGVmdF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KIyAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQojICAgICAgICAgICAgICAgc2VsZWN0KC1zZWN0b3IpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQojICAgbXV0YXRlKHBweWVfcG9yX3Bvem8gPSBwcm9wX3BsYW50X2VxdWlwIC90b3RhbF9wb3pvcykNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl9pbnZlcnNpb25fcG96byA8LSBpbnZlcnNpb25fcG96b3MgJT4lIA0KICBmaWx0ZXIoIGFuaW8gPj0gMjAxMikgJT4lDQogIGdncGxvdChhZXMoYW5pbyxpbnZlcnNpb25fcG9yX3Bvem8sIGNvbG9yID0gZW1wcmVzYSApKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIHNvYnJlIHBvem9zIElBUEciLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uX3Bvem8sIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCmdyYWZfaW52ZXJzaW9uX3Bvem9fMiA8LSBpbnZlcnNpb25fcG96b3NfMiAlPiUgDQogIGZpbHRlciggYW5pbyA8PSAyMDEyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLGludmVyc2lvbl9wb3JfcG96bywgY29sb3IgPSBlbXByZXNhICkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIHJlYWxpemFkYXMgc29icmUgcG96b3MgSUFQRyIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96b18yLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCkNvbiBwb3pvcyBDYXAgSVYNCmBgYHtyIGVjaG89RkFMU0V9DQojIGNvbiBpbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3INCmludmVyc2lvbl9wb3pvc19jYXBpdiA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9YW5pb190ZXJtaW5hY2lvbl9wb3pvKSAlPiUgDQogIGxlZnRfam9pbihpbnZlcnNpb25lc19hbmlvX2FudGVyaW9yICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCksIGJ5ID0gYygiZW1wcmVzYSIsICJhbmlvIiApKSAlPiUNCiAgbXV0YXRlKGludmVyc2lvbl9wb3JfcG96byA9IGludmVyc2lvbl9leHBsb3RhY2lvbiAvcG96b3MpDQoNCmdyYWZfaW52ZXJzaW9uX3Bvem8gPC0gaW52ZXJzaW9uX3Bvem9zX2NhcGl2ICU+JSANCiAgZmlsdGVyKCBhbmlvID49IDIwMTIpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8saW52ZXJzaW9uX3Bvcl9wb3pvLCBjb2xvciA9IGVtcHJlc2EgKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgYcOxbyBhbnRlcmlvciBzb2JyZSBwb3pvcyBDYXBpdHVsbyBJViIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96bywgd2lkdGggPSA3MDAsIGhlaWdodCA9IDQwMCkNCg0KDQpgYGANCg0KDQoNCiMgVmFsb3IgdG90YWwgZGUgbGEgcHJvZHVjY2nDs24geSBnYW5hbmNpYQ0KDQojIyBQQkkNCg0KDQpbUHJvZHVjdG8gSW50ZXJubyBCcnV0byBFeHBsb3RhY2nDs24gTWluYXMgeSBDYW50ZXJhcyBNaWxsb25lcyBkZSBwZXNvcyBjb25zdGFudGVzLiBCYXNlIDE5NjAuIFZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gbWlsbG9uZXMgZGUgcGVzb3MgZGUgMTk2MC4gMTk3MC0xOTgwXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L3NzcG0tcHJvZHVjdG8taW50ZXJuby1icnV0by1zZWN0b3JpYWwtMTk3MC0xOTgwKQ0KDQoNCltQcm9kdWN0byBJbnRlcm5vIEJydXRvIEV4cGxvdGFjacOzbiBNaW5hcyB5IENhbnRlcmFzLCBBdXN0cmFsZXMgY29uc3RhbnRlcy4gQmFzZSAxOTcwLlZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gYXVzdHJhbGVzIGEgcHJlY2lvcyBkZSAxOTcwLiAxOTgwLTE5OTBdKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvc3NwbS1wcm9kdWN0by1pbnRlcm5vLWJydXRvLXNlY3RvcmlhbC0xOTgwLTE5OTApIA0KIA0KDQojIyBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiwgVmFsb3IgQWdyZWdhZG8geSBDb25zdW1vIEludGVybWVkaW8gDQoNCkhheSBkb3MgZXN0aW1hY2lvbmVzIGRlbCBWYWxvciBCcnV0byB5IEFncmVnYWRvIGRlIFByb2R1Y2Npw7NuLCBjb24gc3UgY29ycmVzcG9uZGllbnRlIENvbnN1bW8gSW50ZXJlbWVkaW8sIGxvcyBjdWFsZXMgY29ycmVzcG9uZGVuIGEgZnVlbnRlcyBkaXN0aW50YXMuIEFzaW1pc21vLCBzZSBkZWR1Y2UgbGEgcGx1c2Fsw61hIHRvdGFsIGRlIGxhIHJhbWEgbHVlZ28gZGUgZGVzY29udGFyIGRlbCBWYWxvciBBZ3JlZ2FkbyBlbCByZXNwZWN0aXZvIGNvbnN1bW8gaW50ZXJtZWRpbywgbWFzYSBzYWxhcmlhbCwgaW1wdWVzdG9zIGVzcGVjw61maWNvcyB5IGRlcHJlY2lhY2nDs24gZGUgY2FwaXRhbC4NCg0KDQpGdWVudGVzOiANCg0KKiAgSU5ERUMgLSBEaXJlY2Npw7NuIE5hY2lvbmFsIGRlIEN1ZW50YXMgTmFjaW9uYWxlcyAoQmFzZSBNaW5lcsOtYSBlIEhpZHJvY2FyYnVyb3MgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcykuIExhcyB2YXJpYWJsZXMgImV4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyIgcmVmaWVyZW4gYSAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIHkgZ2FzIG5hdHVyYWwuIEFjdGl2aWRhZGVzIGRlIHNlcnZpY2lvcyByZWxhY2lvbmFkYXMgY29uIGxhIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcywgZXhjZXB0byBsYXMgYWN0aXZpZGFkZXMgZGUgcHJvc3BlY2Npw7NuIiANCg0KKiBDw6FsY3VsbyBwcm9waW8gZGVsIFZCUCBjb24gZGF0b3MgZGF0b3MgZGUgcHJvZHVjY2nDs24geSBwcmVjaW8gaW50ZXJuYWNpb25hbCByZWNvcGlsYWRvcy4gTGFzIGZ1ZW50ZXMgc29uIGxhcyBzaWd1aWVudGVzIChsb3MgY3JpdGVyaW9zIHNvbiBsb3MgbWlzbW9zIHBhcmEgbGEgdXRpbGl6YWNpw7NuIHBvc3RlcmlvciBlbiBlbCBjw6FsY3VsbyBkZSByZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MsIHNvYnJldmFsdWFjacOzbiBjYW1iaWFyaWEgeSBvdHJvcyBtZWNhbmlzbW9zKQ0KDQojIyMjIEZ1ZW50ZXMgZWxlZ2lkYXMgcGFyYSBsYSBjb25zdHJ1Y2Npw7NuIGRlIHNlcmllcyANCg0KKiBQcm9kdWNjacOzbiBkZSBDcnVkbzogDQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgLSBhY3R1YWxpZGFkOiBTRVNDTyBEb3duc3RyZWFtDQogIA0KKiBFeHBvcnRhY2lvbmVzIGRlIENydWRvOiANCiAgKyAxOTYyIGEgMTk5MzogVU4gQ29tdHJhZGUgKGNsYXNpZmljYWNpw7NuIFNJVEMgYXMgcmVwb3J0ZWQpDQogICsgMTk5NCBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICArIExvcyBkYXRvcyBmYWx0YW50ZXMgZGUgU0VTQ08gc2UgY29tcGxldGFyb24gY29uIE1FQ09ODQogICsgU2lndWVuIGhhYmllbmRvIGRhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTY1LCAxOTcwLTc0LCAxOTc2LTc4LCAxOTgwLTg0DQogIA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIENydWRvOiANCiAgKyAxOTYzIGEgMTk2NTogS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFIGFqdXN0YWRvIGNvbiBlbCDDrW5kaWNlIGRlbCBwcmVjaW8gZGVsIEFudWFyaW8gZGUgWVBGIA0KICArIDE5ODkgYSAxOTkxOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NjYgYSAxOTg4OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUNCiAgKyAxOTkyOiBNRUNPTiBhanVzdGFkbyBjb24gbGEgdmFyaWFjacOzbiBkZWwgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGFsIHBvciBtYXlvciAoSVBJTSkNCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBNRUNPTiANCiAgDQoqIFByZWNpbyBNZXJjYWRvIEV4dGVybm8gQ3J1ZG86DQogICsgZW50cmUgMTk2MiB5IDE5OTI6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgZW50cmUgMTk5My0yMDAxIHkgMjAwNC0yMDE0OiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBNZWNvbg0KICArIGVudHJlIDIwMDIgeSAyMDAzOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoQ2xhc2lmaWNhY2nDs24gSFMgYXMgcmVwb3J0ZWQpICANCiAgKyAyMDE0IGVuIGFkZWxhbnRlOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoUmVnYWzDrWFzKQ0KICArIFZhbG9yZXMgZmFsdGFudGVzIHByZXZpb3MgYSAxOTkyOiBCcmVudCAgKEZ1ZW50ZTogSW5mbGF0aW9uIERhdGEpDQogIA0KKiBQcm9kdWNjacOzbiBkZSBHYXM6DQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgDQoqIEV4cG9ydGFjaW9uZXMgZGUgZ2FzOiANCiAgKyAxOTYyIGEgMTk5NjogVU4gQ29tdHJhZGUsDQogICsgMTk5NyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTk5IHkgMjAwMA0KICANCiogUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBnYXM6DQogICsgMTk2MyAtIDE5NjkgJiAxOTg5IC0gMTk5MjogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTcwIC0gMTk4ODogIEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gQmFzZSBSZWdhbMOtYXMNCiAgKyBFbCBkYXRvIGRlbCBhw7FvIDE5OTIgc2UgZGl2aWRpw7MgcG9yIDEwLCBkYWRvIHF1ZSByZXN1bHRhYmEgZXhjZXNpdmFtZW50ZSBhbHRvLCBsbyBjdWFsIGVzIG1ldG9kb2zDs2dpY2FtZW50ZSBpbmFjZXB0YWJsZSBwZXJvIHNpcnZlIGRlIGVqZXJjaWNpby4gDQogIA0KKiBQcmVjaW8gTWVyY2FkbyBFeHRlcm5vOg0KICArIEHDsW9zIDE5NjQgeSAxOTY1OiBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIGdhcyBwcm92ZW5pZW50ZSBkZSBCb2xpdmlhIGhhY2lhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIDE5NjYgZW4gYWRlbGFudGU6IFByZWNpbyBkZSBleHBvcnRhY2lvbiBkZSBnYXMgZGVzZGUgQm9saXZpYSBhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyBwcmV2aW9zIGEgMTk2MyB5IHBlcsOtb2RvIDE5NjgtMTk3MSANCg0KPGJyPg0KDQoNCg0KIyMjIEVzdGltYWNpw7NuIHBvciBDdWVudGFzIE5hY2lvbmFsZXMNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGNvZWZpY2llbnRlcyBkZSByZXF1ZXJpbWllbnRvcyBkaXJlY3Rvcw0KDQojIGV4dHJhaWRvIGRlIE1JUCA5NyBhIHBhcnRpciBkZSBDSS9WQlAgDQojIGNvZWZfcmVxX2RpcmVjdG9zIDwtICAwLjI3MjI2NDYzOA0KDQojIGV4dHJhaWRvIGRlIGN1YWRybyBkZSB1dGlsaXphY2lvbiAyMDA0IGEgcGFydGlyIGRlIENJL1ZCUA0KY29lZl90ZWNuaWNvIDwtICAwLjM2OTEwNDMwMg0KDQpjb2VmX3RlY25pY29fOTcgPC0gMC4zNzQxMjU4ODcNCg0KDQojTUlQDQoNCiNDVU8gDQpDT1UgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvTUlQL3NoX2NvdV8wNl8xNi54bHMiLCANCiAgICBza2lwID0gMikgJT4lDQogIHJlbmFtZShzZWN0b3IgPSAiLi4uMSIsDQogICAgICAgICBjcGMgPSAiLi4uMiIpICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3Qoc2VjdG9yLCAiXFxkIikgJiAhKHN0cl9kZXRlY3Qoc2VjdG9yLCAiXk4iKSkpDQoNCnNlcnZpY2lvX3NfZXh0cmFjY2lvbiA8LSAgc3VtKENPVVsxMl0pL3N1bShDT1VbMTFdKQ0KbnJvdyhDT1UpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdmJwX3ZhX2NpX2Njbm4gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiQ3VlbnRhcyBOYWNpb25hbGVzIiwgc2tpcCA9IDUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gICIuLi41IiwNCiAgICAgICAgdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gICIuLi4xNSIpICU+JSANCiAgZmlsdGVyKGlzLm5hKHBlcmlvZG8pLCAhaXMubmEoYW5pbykgKSAlPiUgICNmaWx0cmFtb3MgbG9zIGRhdG9zIGFudWFsZXMNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZSh2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgIHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcz0gYXMuZG91YmxlKHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyksDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqICgxIC0gc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9IHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqICgxIC0gc2VydmljaW9fc19leHRyYWNjaW9uKSwNCiAgICAgICAgIGNpX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcz0NCiAgICAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcy12YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zIC0gdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICwgDQogICAgICAgICB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zICwgDQogICAgICAgICB2YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUNCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eC8xMF4zfSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBjb2VmX3JlcV9leHRyX3lfc2VydiA9Y2lfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zL3ZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjb2VmX3JlcV9leHRyID0gY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zL3ZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgZmlsdGVyKCEoaXMubmEoY29lZl9yZXFfZXh0cl95X3NlcnYpKSkNCnZicF92YV9jaV9jY25uDQoNCm1lYW5fY29lZl9yZXFfZXh0cl9jY25uIDwtIG1lYW4odmJwX3ZhX2NpX2Njbm4kY29lZl9yZXFfZXh0cikNCm1lYW5fY29lZl9yZXFfZXh0cl9jY25uX2IgPC0gbWVhbihzdW0odmJwX3ZhX2NpX2Njbm4kY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKS8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0odmJwX3ZhX2NpX2Njbm4kdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcykpDQoNCmBgYA0KDQojIyMgRXN0aW1hY2lvbmVzIGVuIGJhc2UgYSBmdWVudGVzIHJlY29waWxhZGFzLiBNZXRvZG9sb2fDrWEgcHJvcGlhIHkgQ0NOTg0KDQoNCiQkVkJQX3twcm9waWF9ID0gKFBleHRfe3BldHLDs2xlb30gKiBRX3twZXRyw7NsZW99ICsgUGV4dF97Z2FzfSAqIFFfe2dhc30pICogVENQJCQNCiQkVkJQX3tDQ05OfSA9IChQaW50X3twZXRyw7NsZW99ICogUU1JbnRfe3BldHLDs2xlb30gKyBQZXh0X3twZXRyw7NsZW99ICogRXhwb197cGV0csOzbGVvfSArIFBpbnRfe2dhc30gKiBRTUludF97Z2FzfSArIFBleHRfe2dhc30gKiBFeHBvX3tnYXN9KSogVENDJCQNCg0KDQpEb25kZTogDQoNCiogJFZCUF97cHJvcGlhfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiwgZXN0aW1hY2nDs24gcHJvcGlhDQoqICRWQlBfe0NDTk59JCA9IFZhbG9yIEJydXRvIGRlIGxhIFByb2R1Y2Npw7NuLCAgY3JpdGVyaW8gZGUgbGFzIENDTk4NCiogJFBleHRfe3BldHLDs2xlb30kID0gUHJlY2lvIGRlIGV4cG9ydGFjacOzbi9yZWZlcmVuY2lhIGludGVybmFjaW9uYWwgZGVsIHBldHLDs2xlbyBjcnVkbw0KKiAkUGV4dF97Z2FzfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuL3JlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCBkZWwgZ2FzIG5hdHVyYWwNCiogJFBpbnRfe3BldHLDs2xlb30kID0gUHJlY2lvIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvDQoqICRQaW50X3tnYXN9JCA9IFByZWNpbyBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsDQoqICRRX3twZXRyw7NsZW99JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyB0b3RhbGVzIGRlIHBldHLDs2xlbyBjcnVkbw0KKiAkUV97Z2FzfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgdG90YWxlcyBkZSBnYXMgbmF0dXJhbA0KKiAkUU1JbnRfe3BldHLDs2xlb30kID0gY2FudGlkYWRlcyB2ZW5kaWRhcyBhbCBtZXJjYWRvIGludGVybm8gZGUgcGV0csOzbGVvIGNydWRvDQoqICRRTUludF97Z2FzfSQgPSBjYW50aWRhZGVzIHZlbmRpZGFzIGFsIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwNCiogJEV4cG9fe3BldHLDs2xlb30kID0gZXhwb3J0YWNpb25lcyBkZSBwZXRyw7NsZW8gY3J1ZG8NCiogJEV4cG9fe2dhc30kID0gZXhwb3J0YWNpb25lcyBkZSBnYXMgbmF0dXJhbA0KKiAkVENDJCA9IFRpcG8gZGUgQ2FtYmlvIENvbWVyY2lhbA0KKiAkVENQJCA9IFRpcG8gZGUgQ2FtYmlvIGRlIFBhcmlkYWQNCg0KDQokJCBDSV97cHJvcGlhfSA9IFZCUF97Q0NOTn0gKiAgQ29lZlxfdGVjICQkDQogDQoNCiQkVkFfe3Byb3BpYX0gID0gVkJQX3twcm9waWF9IOKAkyBDSV97cHJvcGlhfSAkJA0KDQoNCkRvbmRlOg0KDQoqICRDSV97cHJvcGlhfSQgPSBDb25zdW1vIEludGVybWVkaW8sIGVzdGltYWNpw7NuIHByb3BpYQ0KKiAkVkFfe3Byb3BpYX0kID0gVmFsb3IgQWdyZWdhZG8sIGVzdGltYWNpw7NuIHByb3BpYSANCiogJENvZWZcX3RlYyQgPSBDb2VmaWNpZW50ZSB0w6ljbmljbyBkZSBNYXRyaXogSW5zdW1vIFByb2R1Y3RvDQoNCiQkTVNfe3Byb3BpYX0gPSBXICogRW1wICogMTMkJA0KDQpEb25kZTogDQoNCiogJE1TX3twcm9waWF9JCA9IE1hc2EgU2FsYXJpYWwsIGVzdGltYWNpw7NuIHByb3BpYQ0KKiAkVyQgPSAgU2FsYXJpbyBhbnVhbCBwcm9tZWRpbw0KKiAkRW1wJCA9IEVtcGxlbw0KDQokJENvbktmaWpvID0gUFB5RSAqICBwcm9tKFxmcmFje0RlcH17UFB5RX0pICQkDQoNCkRvbmRlOiANCg0KKiAkQ29uS2Zpam8kID0gQ29uc3VtbyBkZSBDYXBpdGFsIEZpam8NCiogJFBQeUUkPSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBuZXRhDQoqICQgcHJvbShcZnJhY3tEZXB9e1BQeUV9KSAkID0gIHRhc2EgZGUgZGVwcmVjaWFjacOzbiBwcm9tZWRpbw0KKiAkRGVwJCA9IERlcHJlY2lhY2lvbmVzIChjdWVudGEgZ2FzdG9zKQ0KDQoNCiQkUFZfe3Byb3BpYX0gID0gVkFfe3Byb3BpYX0g4oCTIE1TX3twcm9waWF9ICDigJMgQ29uS2Zpam8gLSBJTVAgJCQNCg0KDQpEb25kZToNCg0KKiAgJFBWX3twcm9waWF9JCA9IFBsdXN2YWzDrWEgKCpFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuKikNCiogICRJTVAkID0gSW1wdWVzdG9zIG5vcm1hbGVzDQoNCkVuIGxvcyBjYXNvcyBlbiBsb3MgcXVlIHNlIHByZXNlbnRhIGRhdG8gZGUgY29uc3VtbyBpbnRlcm1lZGlvIHkgbWFzYSBzYWxhcmlhbCBkZSBsYXMgQ0NOTiwgc2UgcmVhbGl6w7MgZWwgcmVlbXBsYXpvIGRlIGxvcyBkYXRvcyBlc3RpbWFkb3MgcG9yIGxvcyByZWdpc3RyYWRvcyBlbiBDQ05OLg0KDQpDb24gcmVzcGVjdG8gYSBsYSBlc3RpbWFjacOzbiBwcm9waWEsIGVsIGNvbnN1bW8gaW50ZXJtZWRpbyBzZSBlc3RpbcOzIGEgcGFydGlyIGRlIG11bHRpcGxpY2FyIGVsIFZhbG9yIEJydXRvIGRlIFByb2R1Y2Npw7NuIHBvciBlbCBjb2VmaWNpZW50ZSB0w6ljbmljbyByZXN1bHRhbnRlIGRlbCBDdWFkcm8gZGUgVXRpbGl6YWNpb24gZGUgSU5ERUMgYcOxbyAyMDA0IChvYnRlbmlkbyBhIHBhcnRpciBkZWwgcmF0aW8gQ0kvVkJQKS4gU3UgdmFsb3IgZXMgaWd1YWwgMC4zNjksIGxvIGN1YWwgbm8gZXN0w6EgYWxlamFkbyBkZWwgY29lZmljaWVudGUgcHJvbWVkaW8gcmVzdWx0YW50ZSBkZSBsYSBzZXJpZSBkZSBWYWxvciBkZSBsYSBQcm9kdWNjacOzbiBlbiBiYXNlIGEgY3VlbnRhcyBuYWNpb25hbGVzICgwLjQxMikuIFPDrSBzZSBlbmN1ZW50cmEgbcOhcyBhbGVqYWRvIGRlbCBjb2VmaWNpZW50ZSBkZSBsYSBNSVAgYmFzZSAxOTk3ICgwLjI3MikuDQoNClBvciBzdSBwYXJ0ZSwgbGEgbWFzYSBzYWxhcmlhbCBzZSBjYWxjdWzDsyBjb21vIGxhIG11bHRpcGxpY2FjacOzbiBlbnRyZSBsYSByZW11bmVyYWNpw7NuIHByb21lZGlvIGRlIGxhIHJhbWEgcG9yIGVsIGVtcGxlbyByZWdpc3RyYWRvIHBvciBsb3MgMTIgbWVzZXMgZGVsIGHDsW8gbcOhcyBlbCBhZ3VpbmFsZG8uIExvcyBhw7FvcyBmYWx0YW50ZXMgc2UgY29tcGxldGFyb24gcG9yIG1lZGlvIGRlIG11bHRpcGxpY2FyIGVsIFZCUCBwb3IgZWwgcGVzbyBwcm9tZWRpbyBkZSBsYSBtYXNhIHNhbGFyaWFsIHBhcmEgbG9zIGHDsW9zIGNvbiBkYXRvcy4gVW4gbcOpdG9kbyBzaW1pbGFyIGFwbGljYSBEYWNoZXZza3k6IHJlc3VsdGEgZGUgbXVsdGlwbGljYXIgZWwgVkJQIHBvciBsYSBwcm9wb3JjacOzbiBlbnRyZSBsYSByZW11bmVyYWNpw7NuIGEgbG9zIGFzYWxhcmlhZG9zIHNvYnJlIGVsIHZhbG9yIHRvdGFsIGRlIHByb2R1Y2Npw7NuIGRlIFlQRiBwYXJhIGVsIGHDsW8gMTk3My8xOTYzLiANCg0KRWwgY29uc3VtbyBkZSBjYXBpdGFsIGZpam8gc3VyZ2UgZGUgYXBsaWNhciBsYSB0YXNhIGRlIGRlcHJlY2lhY2nDs24gcHJvbWVkaW8gcmVzdWx0YW50ZSBkZSBsb3MgYmFsYW5jZXMgZGUgWVBGICgxOTk4IC0gMjAxOCkgYWwgc3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIGVzdGltYWRvICh2ZXIgYXBhcnRhZG8gKkVzdGltYWNpw7NuIGRlIHN0b2NrIGRlIGNhcGl0YWwgYSBwYXJ0aXIgZGUgbGEgZXZvbHVjacOzbiBkZSBwb3pvcyBwZXJmb3JhZG9zKikgLiANCg0KDQoNCkNvcnJlY2Npw7NuIFZQQg0KDQpDdWFkcm8gdXRpbGl6YWNpb24gZGUgb2ZlcnRhDQpwZXNvIGRlIGxvcyBzZXJ2aWNpb3MgPSBTZXJ2aWNpb3MgcGV0cm9sZW8vZXh0cmFjY2lvbiA9IDEwLDclICgyKQ0KDQphw7FvcyAyMDA0LTIwMTENCmFwbGljYW1vcyBjb2VmIGEgYmFzZSBtaW5lcmlhL2hpZHJvY2FyYnVyb3MgQ0NOTg0KVkJQIGV4dHJhY2Npb24oIENDTk4pID0gVkJQIGV4dHJhY2Npb24geSBzZXJ2aWNpb3MgKENDTk4pICogMCw4OTMgKDEpDQoNCjE5MTAgLSAyMDE4DQphcm1hciBpbmRpY2UgVkJQIGNyaXRlcmlvIENDTk4gcGFyYSBtb3ZlciAoMSkgbG9zIGHDsW9zIHF1ZSBub3MgZmFsdGFuICgxOTEwIC0gMjAwNCB5IDIwMTIgLTIwMTgpIA0KZGViZXJpYSBzZXIgPSBxdWUgYXBsaWNhciBjb2VmICgyKSBhIFZCUA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcmVjaW9zX3lfY2FudGlkYWRlcyA8LSBwcm9kX21lcmdlX2NydWRvICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2NydWRvID0gdW5pZGFkLCBwcm9kX2NydWRvKSAlPiUNCiAgbGVmdF9qb2luKGV4cG9fcV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9jcnVkbyA9dW5pZGFkLCBleHBvX2NydWRvKSkgJT4lIA0KICBsZWZ0X2pvaW4oZXhpc3RlbmNpYXNfcGV0cm9sZW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfY3J1ZG8gPSB1bmlkYWQsIGV4aXN0ZW5jaWFzX2NydWRvKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhpc3RlbmNpYXNfY3J1ZG89MCApKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleHBvX2NydWRvPTAgKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9wcmVjaW9fY3J1ZG8gPSB1bmlkYWQsIHByZWNpb19jcnVkb19tZG9pbnQpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJlY2lvX2NydWRvID0gdW5pZGFkLCBwcmVjaW9fbWVfY3J1ZG8pLCBieSA9IGMoImFuaW8iLCAidW5pZGFkX3ByZWNpb19jcnVkbyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9nYXM9IHVuaWRhZCxwcm9kX2dhcyksIGJ5ID0gImFuaW8iKSAlPiUNCiAgbGVmdF9qb2luKGV4cG9fcV9nYXNfTU1CVFUgJT4lIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9nYXM9IHVuaWRhZCwgZXhwb19nYXMpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX3ByZWNpb19nYXMgPSB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcyksIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHRjcCwgdGNjKSwgYnkgPSAiYW5pbyIpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdmJwX3ZhX2NpX3Byb3BpYSA8LSBwcmVjaW9zX3lfY2FudGlkYWRlcyAlPiUgDQogIG11dGF0ZShjcnVkb19tZG9faW50ZXJubyA9IHByb2RfY3J1ZG8gLSBleHBvX2NydWRvLA0KICAgICAgICAgZXhwb19nYXMgPSByZXBsYWNlX25hKGV4cG9fZ2FzLCAwICksDQogICAgICAgICBnYXNfbWRvX2ludGVybm8gPSBwcm9kX2dhcyAtIGV4cG9fZ2FzLA0KICAgICAgICAgdW5pZGFkX3ZhbG9yX3Byb2R1Y2Npb24gPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICB2YnBfY3JpdGVyaW9fY2NubiA9ICgoY3J1ZG9fbWRvX2ludGVybm8qcHJlY2lvX2NydWRvX21kb2ludCtleHBvX2NydWRvKnByZWNpb19tZV9jcnVkbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2FzX21kb19pbnRlcm5vICogcHJlY2lvX2dhc19tZG9pbnQgK2V4cG9fZ2FzKnByZWNpb19leHRlcm5vX2dhcyApKnRjYykvMTBeNiwNCiAgICAgICAgIHZhbG9yX2JydXRvX2NydWRvID0gKHByb2RfY3J1ZG8qcHJlY2lvX21lX2NydWRvKnRjcCkvMTBeNiwNCiAgICAgICAgIHZhbG9yX2JydXRvX2dhcyA9ICAgKHByb2RfZ2FzICogcHJlY2lvX2V4dGVybm9fZ2FzKnRjcCkvMTBeNiwNCiAgICAgICAgIHZicF9jcml0ZXJpb19wcm9waW8gPSB2YWxvcl9icnV0b19jcnVkbyArIHZhbG9yX2JydXRvX2dhcywgDQogICAgICAgICBjb25zdW1vX2ludGVybWVkaW8gPSB2YnBfY3JpdGVyaW9fY2NubiAqIGNvZWZfdGVjbmljbywNCiAgICAgICAgIHZhbG9yX2FncmVnYWRvID0gdmJwX2NyaXRlcmlvX3Byb3BpbyAtIGNvbnN1bW9faW50ZXJtZWRpbyApDQp2YnBfdmFfY2lfcHJvcGlhDQoNCmluZGljZV92YnBfY3JpdGVyaW9fY2NubiA8LSB2YnBfdmFfY2lfcHJvcGlhICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHZicF9jcml0ZXJpb19jY25uXzA0ID0gZ2VuZXJhcl9pbmRpY2UodmJwX2NyaXRlcmlvX2Njbm4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDQpLA0KICAgICAgICAgdmJwX2NyaXRlcmlvX2Njbm5fMTIgPSBnZW5lcmFyX2luZGljZSh2YnBfY3JpdGVyaW9fY2NubiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gMjAxMikpICU+JSANCiAgc2VsZWN0KGFuaW8sIHZicF9jcml0ZXJpb19jY25uXzA0LHZicF9jcml0ZXJpb19jY25uXzEyKQ0KDQoNCmBgYA0KDQoNCg0KIyMgRW1wbGVvLCBSZW11bmVyYWNpb25lcyB5IE1hc2EgU2FsYXJpYWwgKENDTk4pDQoNCkZ1ZW50ZXM6DQoNCiogTVRFeVNTIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKQ0KKiBbTWluaXN0ZXJpbyBkZSBUcmFiYWpvLCBFbXBsZW8geSBTZWd1cmlkYWQgU29jaWFsIC0gT2JzZXJ2YXRvcmlvIGRlIEVtcGxlbyB5IERpbsOhbWljYSBFbXByZXNhcmlhbCAoT0VERSldKGh0dHA6Ly93d3cudHJhYmFqby5nb2IuYXIvZXN0YWRpc3RpY2FzL29lZGUvZXN0YWRpc3RpY2FzbmFjaW9uYWxlcy5hc3ApDQoqIEZhbHRhIEVQSA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2FudWFyaW9zIENFUEFMDQpjZXBhbF8xOTkxIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvQ0VQQUwvY2VwYWxfMTk5MS54bHN4IikgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIGNvbnZlcnNvcl9wZXNvcyRBIC8xMF4zLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKQ0KDQptYXNhX3NhbGFyaWFsX2NlcGFsIDwtIGNlcGFsXzE5OTEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInJlbXVuZXJhY2lvbl9hbF90cmFiYWpvIikgJT4lIA0KICByZW5hbWUobXNfY2VwYWwgPSB2YWxvcikNCiAgDQoNCiNjb24gZGF0b3MgZGUgbGEgYmFzZSBkZSBDQ05ODQplbXBsZW8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJFbXBsZW8gcmVnaXN0cmFkbyIsIHNraXAgPSA1KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgIHBlcmlvZG8gPSJQZXLDrW9kbyIsDQogICAgICAgICBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gIi4uLjciLA0KICAgICAgICBlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSAiLi4uOCIgKSAlPiUNCiAgIGZpbHRlcihpcy5uYShwZXJpb2RvKSwgIWlzLm5hKGFuaW8pICkgJT4lDQogIHNlbGVjdChhbmlvLCBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLGVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyApICU+JSANCiAgbXV0YXRlKHVuaWRhZF9lbXBsZW8gPSAiUHVlc3RvcyBkZSB0cmFiYWpvIiwNCiAgICAgICAgIGVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyksDQogICAgICAgICBlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSkgDQogIA0KDQpzYWxhcmlvcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIA0KICAgIHNoZWV0ID0gIlJlbXVuZXJhY2lvbmVzIiwgY29sX3R5cGVzID0gYygibnVtZXJpYyIsIA0KICAgICAgICAiZGF0ZSIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiKSwgc2tpcCA9IDUpICU+JSANCiAgICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICAgIHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gIi4uLjciLA0KICAgICAgICAgc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uOCIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSAmIGFuaW8gPCAyMDE0KSAlPiUgDQogIHNlbGVjdChhbmlvLCBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyxzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zICkgJT4lIA0KICBtdXRhdGUodW5pZGFkX3NhbGFyaW8gPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcz0gYXMuZG91YmxlKHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9IGFzLmRvdWJsZShzYWxhcmlvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKSkNCiAgIA0KbWFzYV9zYWxhcmlhbF9jY25uIDwtIGVtcGxlbyAlPiUgDQogIGxlZnRfam9pbihzYWxhcmlvcywgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9tYXNhX3NhbGFyaWFsID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uID0gKHNhbGFyaW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zICplbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9zZXJ2aWNpb3MgPSAoc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAqZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF90b3RhbCA9IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiArIG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zKSANCg0KDQoNCiNjb24gZGF0b3MgZGUgZW1wbGVvIHJlZ2lzdHJhZG8gDQpyZW11bmVyYWNpb25lc19hbnVhbCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01pbmlzdGVyaW8gVHJhYmFqby9uYWNpb25hbF9zZXJpZV9yZW11bmVyYWNpb25lc19hbnVhbC54bHN4IiwgDQogICAgc2hlZXQgPSAiQyA1IiwgY29sX3R5cGVzID0gYygic2tpcCIsIA0KICAgICAgICAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiKSwgc2tpcCA9IDQpICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUNCiAgcmVuYW1lKHJhbWFfYWN0aXZpZGFkID0gIlJhbWEgZGUgYWN0aXZpZGFkIikgJT4lIA0KICBmaWx0ZXIoIHN0cl9kZXRlY3QocmFtYV9hY3RpdmlkYWQsICJwZXRyw7NsZW8iKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkX3NhbGFyaW8gPSAiUGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICByYW1hX2FjdGl2aWRhZD0gDQogICAgICAgICAgIGNhc2Vfd2hlbihyYW1hX2FjdGl2aWRhZD09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGl2aWRhZGVzICBkZSBzZXJ2aWNpb3MgcmVsYWNpb25hZGFzIGNvbiBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIGV4Y2VwdG8gbGFzIGFjdGl2aWRhZGVzIGRlIHByb3NwZWNjacOzbiIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtdW5lcmFjaW9uX3NlcnZpY2lvc19leHRyYWNjaW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8geSBnYXMgbmF0dXJhbCIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtdW5lcmFjaW9uX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikpICU+JSANCiAgICBmaWx0ZXIoIShpcy5uYShyYW1hX2FjdGl2aWRhZCkpKSAlPiUgDQogIHNwcmVhZChrZXkgPSByYW1hX2FjdGl2aWRhZCwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpDQogIA0KDQoNCmVtcGxlb19hbnVhbCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01pbmlzdGVyaW8gVHJhYmFqby9uYWNpb25hbF9zZXJpZV9lbXBsZW9fYW51YWwueGxzeCIsIA0KICAgIHNoZWV0ID0gIkMgNSIsIGNvbF90eXBlcyA9IGMoInNraXAiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiksIA0KICAgIHNraXAgPSA0KSU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUNCiAgcmVuYW1lKHJhbWFfYWN0aXZpZGFkID0gIlJhbWEgZGUgYWN0aXZpZGFkIikgJT4lIA0KICBmaWx0ZXIoIHN0cl9kZXRlY3QocmFtYV9hY3RpdmlkYWQsICJwZXRyw7NsZW8iKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBhcy5kb3VibGUodmFsb3IpLA0KICAgICAgICAgdW5pZGFkX2VtcGxlbyA9ICJQdWVzdG9zIGRlIHRyYWJham8iLA0KICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9IGNhc2Vfd2hlbihyYW1hX2FjdGl2aWRhZD09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGl2aWRhZGVzICBkZSBzZXJ2aWNpb3MgcmVsYWNpb25hZGFzIGNvbiBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIGV4Y2VwdG8gbGFzIGFjdGl2aWRhZGVzIGRlIHByb3NwZWNjacOzbiIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW1wbGVvX3NlcnZpY2lvc19leHRyYWNjaW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8geSBnYXMgbmF0dXJhbCIgfiAiZW1wbGVvX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikpICU+JSANCiAgZmlsdGVyKCEoaXMubmEocmFtYV9hY3RpdmlkYWQpKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gcmFtYV9hY3RpdmlkYWQsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKQ0KDQptYXNhX3NhbGFyaWFsX29lZGUgPC0gZW1wbGVvX2FudWFsICU+JSANCiAgbGVmdF9qb2luKHJlbXVuZXJhY2lvbmVzX2FudWFsLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX21hc2Ffc2FsYXJpYWwgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24gPSAoICByZW11bmVyYWNpb25fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMgKmVtcGxlb19leHRyYWNjaW9uX3BldHJvbGVvX2dhcyoxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zID0gKHJlbXVuZXJhY2lvbl9zZXJ2aWNpb3NfZXh0cmFjY2lvbiAqZW1wbGVvX3NlcnZpY2lvc19leHRyYWNjaW9uKjEzKS8xMF42LA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF90b3RhbCA9IG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zICsgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uLA0KICAgICAgICAgYW5pbyA9YXMuZG91YmxlKGFuaW8pKQ0KDQptYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgPC0gbWFzYV9zYWxhcmlhbF9jY25uICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9tYXNhX3NhbGFyaWFsLCBtYXNhX3NhbGFyaWFsX2Njbm4gPSBtYXNhX3NhbGFyaWFsX3RvdGFsKSAlPiUgDQogIGZ1bGxfam9pbihtYXNhX3NhbGFyaWFsX29lZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX21hc2Ffc2FsYXJpYWwsIA0KICAgICAgICAgICAgICAgICAgICAgbWFzYV9zYWxhcmlhbF9vZWRlID1tYXNhX3NhbGFyaWFsX3RvdGFsKSkgJT4lIA0KICBmdWxsX2pvaW4obWFzYV9zYWxhcmlhbF9jZXBhbCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIG1zX2NlcGFsKSkgJT4lIA0KICBtdXRhdGUobXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTYgfiBtc19jZXBhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NiB+bWFzYV9zYWxhcmlhbF9vZWRlKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQptYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgIA0KDQoNCmBgYA0KDQojIyBQbHVzdmFsw61hIHRvdGFsIGRlbCBzZWN0b3INCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNjb24gYmFzZSBkZSBjdWVudGFzIG5hY2lvbmFsZXMNCnB2X2hpZHJvY2FyYnVyb3NfY2NubiA8LSB2YnBfdmFfY2lfY2NubiAlPiUgDQogIGxlZnRfam9pbihtYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHVuaWRhZCwNCiAgICAgICAgICAgICAgICAgICAgIG1hc2Ffc2FsYXJpYWwgPSBtYXNhX3NhbGFyaWFsX29lZGUpLCBieSA9IGMoImFuaW8iLCAidW5pZGFkIikpICU+JSANCiAgbXV0YXRlKGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiA9IHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAtbWFzYV9zYWxhcmlhbCkgJT4lIA0KICByZW5hbWUodmFsb3JfYnJ1dG9fcHJvZHVjY2lvbiA9IHZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjb25zdW1vX2ludGVybWVkaW8gPSBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICB2YWxvcl9hZ3JlZ2Fkbz0gdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKQ0KDQoNCg0KI2NvbiBiYXNlIGRlIFZCUCBkZSBlbGFib3JhY2lvbiBwcm9waWENCm1lYW5fY29lZl9tcyA8LSAgbWVhbigocHZfaGlkcm9jYXJidXJvc19jY25uICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoY29lZl9tYXNhX3NhbGFyaWFsID0gbWFzYV9zYWxhcmlhbC92YWxvcl9icnV0b19wcm9kdWNjaW9uKSAlPiUgDQogIGZpbHRlcighKGlzLm5hKGNvZWZfbWFzYV9zYWxhcmlhbCkpKSkkY29lZl9tYXNhX3NhbGFyaWFsKQ0KDQptZWRpYW5fY29lZl9tcyA8LSAgbWVkaWFuKChwdl9oaWRyb2NhcmJ1cm9zX2Njbm4gJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShjb2VmX21hc2Ffc2FsYXJpYWwgPSBtYXNhX3NhbGFyaWFsL3ZhbG9yX2JydXRvX3Byb2R1Y2Npb24pICU+JSANCiAgZmlsdGVyKCEoaXMubmEoY29lZl9tYXNhX3NhbGFyaWFsKSkpKSRjb2VmX21hc2Ffc2FsYXJpYWwpDQoNCiNjb2VmaWNpZW50ZSBGRA0KIyBjb2VmX3NhbGFyaW8gPC0gMC4xOQ0KDQpjb25zdW1vX2tfZmlqb195cGYgPC0gKHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lDQogIGZpbHRlcihlbXByZXNhID09ICJZUEYiKSAlPiUgDQogIGdyb3VwX2J5KGVtcHJlc2EpICU+JSANCiAgbXV0YXRlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uZXMvcHB5ZSkgJT4lIA0KICBzdW1tYXJpc2UodGFzYV9kZXByZWNpYWNpb24gPSBtZWFuKGRlcHJlY2lhY2lvbmVzL3BweWUpKSkkdGFzYV9kZXByZWNpYWNpb24NCg0KdmFyKChyZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JQ0KICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICBncm91cF9ieShmZWNoYSkgJT4lDQogIHN1bW1hcmlzZSh0YXNhX2RlcHJlY2lhY2lvbiA9IG1lYW4oZGVwcmVjaWFjaW9uZXMvcHB5ZSkpKSR0YXNhX2RlcHJlY2lhY2lvbikNCg0KI3Jlc3RpbWFjaW9uIGRlIFZCUCBjcml0ZXJpbyBDQ05ODQp2YnBfY2NubiA8LSB2YnBfdmFfY2lfY2NubiAlPiUgDQogIHNlbGVjdChhbmlvLHVuaWRhZCwgdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcywgdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLCBjaV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgZnVsbF9qb2luKGluZGljZV92YnBfY3JpdGVyaW9fY2NubiwgYnkgPSAiYW5pbyIpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIG11dGF0ZSh2YnBfZXh0cmFjY2lvbl9jY25uID0gY2FzZV93aGVuKA0KICAgIGFuaW8gPCAyMDA0IH4gdmJwX3ZhX2NpX2Njbm4kdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvc1t2YnBfdmFfY2lfY2NubiRhbmlvID09IDIwMDRdICoNCiAgICAgIHZicF9jcml0ZXJpb19jY25uXzA0LA0KICAgIGFuaW8gPiAyMDEyIH4gdmJwX3ZhX2NpX2Njbm4kdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvc1t2YnBfdmFfY2lfY2NubiRhbmlvID09IDIwMTJdICAqDQogICAgICB2YnBfY3JpdGVyaW9fY2Nubl8xMiwNCiAgICBUIH4gdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyksDQogICAgY2lfZXh0cmFjY2lvbl9jY25uID0gdmJwX2V4dHJhY2Npb25fY2Nubipjb2VmX3RlY25pY28sDQogICAgIyBjaV9leHRyYWNjaW9uX2Njbm4gPSB2YnBfZXh0cmFjY2lvbl9jY25uKm1lYW5fY29lZl9yZXFfZXh0cl9jY25uLA0KICAgIHZhX2V4dHJhY2Npb25fY2NubiA9IHZicF9leHRyYWNjaW9uX2Njbm4tIGNpX2V4dHJhY2Npb25fY2NubiwNCiAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JQ0KICBsZWZ0X2pvaW4obWFzYV9zYWxhcmlhbF9oaWRyb2NhcmJ1cm9zICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICB1bmlkYWQsIG1zX2Njbm4gPSBtYXNhX3NhbGFyaWFsX29lZGUpLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIiwgInVuaWRhZCIpKSAlPiUNCiAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoY29uc3Vtb19rX2Zpam8gPSB2YWxvciAqIGlwY18xOCAqIGNvbnN1bW9fa19maWpvX3lwZikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNvbnN1bW9fa19maWpvKSkgJT4lIA0KICBtdXRhdGUobXNfY2NubiA9IGNhc2Vfd2hlbihpcy5uYShtc19jY25uKSB+dmJwX2V4dHJhY2Npb25fY2NubiptZWFuX2NvZWZfbXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtc19jY25uKSwNCiAgICAgICAgIGViZV9jY25uID0gdmFfZXh0cmFjY2lvbl9jY25uIC1tc19jY25uIC1jb25zdW1vX2tfZmlqbywNCiAgICAgICAgIGZ1ZW50ZSA9ICJDQ05OIHJlZXN0aW1hZG8iKSAlPiUgDQogICBzZWxlY3QoYW5pbywgZnVlbnRlLCB1bmlkYWQsIA0KICAgICAgICAgIHZicF9leHRyYWNjaW9uX2Njbm4sIGNpX2V4dHJhY2Npb25fY2NubiwgdmFfZXh0cmFjY2lvbl9jY25uLCANCiAgICAgICAgICBtc19jY25uLCBjb25zdW1vX2tfZmlqbywgZWJlX2Njbm4pICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KdmJwX2Njbm4NCmBgYA0KYGBge3J9DQpyZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lDQogICAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICBncm91cF9ieShlbXByZXNhKSAlPiUgDQogICAgbXV0YXRlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uZXMvcHB5ZSkgJT4lIHNlbGVjdChmZWNoYSwgZW1wcmVzYSwgdGFzYV9kZXByZWNpYWNpb24pDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIHByb3BpYQ0KcHZfaGlkcm9jYXJidXJvc19wcm9waWEgPC0gIHZicF92YV9jaV9wcm9waWEgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ZhbG9yX3Byb2R1Y2Npb24sIA0KICAgICAgICAgdmJwX2NyaXRlcmlvX3Byb3BpbywgY29uc3Vtb19pbnRlcm1lZGlvLHZhbG9yX2FncmVnYWRvICkgJT4lIA0KICAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb19ib2xzYXIiKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShjb25zdW1vX2tfZmlqbyA9IHZhbG9yICogaXBjXzE4ICogY29uc3Vtb19rX2Zpam9feXBmKSAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY29uc3Vtb19rX2Zpam8pKSAlPiUgDQogIG11dGF0ZSgNCiAgICAjIG1hc2Ffc2FsYXJpYWwgPSB2YWxvcl9hZ3JlZ2FkbyAqIGNvZWZfc2FsYXJpbywNCiAgICBtYXNhX3NhbGFyaWFsID0gdmJwX2NyaXRlcmlvX3Byb3BpbyAqIG1lYW5fY29lZl9tcywNCiAgICAgICAgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID0gIHZhbG9yX2FncmVnYWRvIC0gbWFzYV9zYWxhcmlhbCAtIGNvbnN1bW9fa19maWpvKQ0KICANCiMgUFYgQ0NOTiB5IHByb3BpYQ0KcHZfaGlkcm9jYXJidXJvcyA8LSBwdl9oaWRyb2NhcmJ1cm9zX2Njbm4gJT4lIA0KICByZW5hbWUodmJwX2Njbm4gPSB2YWxvcl9icnV0b19wcm9kdWNjaW9uLA0KICAgICAgICAgdmFfY2NubiA9IHZhbG9yX2FncmVnYWRvLA0KICAgICAgICAgY2lfY2NubiA9IGNvbnN1bW9faW50ZXJtZWRpbywNCiAgICAgICAgIG1zX2Njbm4gPSBtYXNhX3NhbGFyaWFsLA0KICAgICAgICAgY29lZl9yZXFfY2NubiA9IGNvZWZfcmVxX2V4dHIsDQogICAgICAgICBlYmVfY2Nubj0gZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uKSAlPiUgDQogIGZ1bGxfam9pbihwdl9oaWRyb2NhcmJ1cm9zX3Byb3BpYSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgLA0KICAgICAgICAgICAgICAgIHZicF9jcml0ZXJpb19wcm9waW8sIGNpX2NyaXRlcmlvX3Byb3BpbyA9IGNvbnN1bW9faW50ZXJtZWRpbywNCiAgICAgICAgICAgICAgICB2YV9jcml0ZXJpb19wcm9waW8gPSB2YWxvcl9hZ3JlZ2FkbyAsIGNvbnN1bW9fa19maWpvX3Byb3BpbyA9IGNvbnN1bW9fa19maWpvKSkgICU+JQ0KICAjIGxlZnRfam9pbih2YnBfdmFfY2lfcHJvcGlhICU+JSANCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdmJwX2NyaXRlcmlvX2Njbm4gKSkgJT4lIA0KICBsZWZ0X2pvaW4odmJwX2Njbm4gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdmJwX2NyaXRlcmlvX2Njbm4gPSB2YnBfZXh0cmFjY2lvbl9jY25uLA0KICAgICAgICAgICAgICAgICAgICAgY2kgPSBjaV9leHRyYWNjaW9uX2Njbm4sIG1zID0gbXNfY2NubikpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIG11dGF0ZSh2YnAgPSB2YnBfY3JpdGVyaW9fcHJvcGlvICwNCiAgICAgICAgICMgY2kgPSBjYXNlX3doZW4oaXMubmEoY2lfY2NubikgfiB2YnBfY3JpdGVyaW9fY2NubiAqIGNvZWZfdGVjbmljbyAgLCBUIH4gIGNpX2Njbm4pLA0KICAgICAgICAgdmEgPSB2YnBfY3JpdGVyaW9fcHJvcGlvIC0gY2ksDQogICAgICAgICAjIG1zID0gY2FzZV93aGVuKGlzLm5hKG1zX2Njbm4pIH4gdmJwX2NyaXRlcmlvX2Njbm4qIG1lYW5fY29lZl9tcywgVCB+ICBtc19jY25uKSwNCiAgICAgICAgIGViZSA9ICB2YSAtIG1zIC1jb25zdW1vX2tfZmlqb19wcm9waW8pDQogICAgICAgICAgDQoNCiMjIw0KdmFsb3JfdG90YWxfcHJvZHVjY2lvbiA8LSBwdl9oaWRyb2NhcmJ1cm9zX2Njbm4gJT4lICAjIG5vIHRpZW5lIGRlc2NvbnRhZG8gc2VydmljaW9zDQogbXV0YXRlKGZ1ZW50ZSA9ICJDQ05OIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBmdWVudGUsdmFsb3JfYnJ1dG9fcHJvZHVjY2lvbix2YWxvcl9hZ3JlZ2FkbywNCiAgICAgICAgIGNvbnN1bW9faW50ZXJtZWRpbywgbWFzYV9zYWxhcmlhbCwgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uKSAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgYmluZF9yb3dzKHB2X2hpZHJvY2FyYnVyb3NfcHJvcGlhICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZSA9ICJDcml0ZXJpbyBQcm9waW8iKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIA0KICAgICAgICAgICAgICAgICAgICAgZnVlbnRlLA0KICAgICAgICAgICAgICAgICAgICAgdmFsb3JfYnJ1dG9fcHJvZHVjY2lvbiA9IHZicF9jcml0ZXJpb19wcm9waW8sDQogICAgICAgICAgICAgICAgICAgICBldmVyeXRoaW5nKC4pKSAlPiUgDQogICAgICAgICAgICAgIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgIDQ6bmNvbCguKSkpICU+JQ0KICBiaW5kX3Jvd3MocHZfaGlkcm9jYXJidXJvcyAlPiUgI3RpZW5lIGRlc2NvbnRhZG8gIHNlcnZpY2lvcw0KICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlID0gIkNyaXRlcmlvIHByb3BpbyBjb24gVkJQIENDTk4iKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGZ1ZW50ZSwgdmFsb3JfYnJ1dG9fcHJvZHVjY2lvbiA9IHZicCwgDQogICAgICAgICAgICAgICAgICAgY29uc3Vtb19pbnRlcm1lZGlvID0gY2ksIA0KICAgICAgICAgICAgICAgICAgIHZhbG9yX2FncmVnYWRvPSB2YSwgDQogICAgICAgICAgICAgICAgICAgbWFzYV9zYWxhcmlhbCA9IG1zLCANCiAgICAgICAgICAgICAgICAgICBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24gPSBlYmUsDQogICAgICAgICAgICAgICAgICAgY29uc3Vtb19rX2Zpam89IGNvbnN1bW9fa19maWpvX3Byb3BpbykgJT4lIA0KICAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAgICAgICAgICAgICAgNDpuY29sKC4pKSkgJT4lIA0KICBiaW5kX3Jvd3ModmJwX3ZhX2NpX3Byb3BpYSAlPiUgIyBubyB0aWVuZSBkZXNjb250YWRvIHNlcnZpY2lvcw0KICAgICAgICAgICAgICBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KC11bmlkYWQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb19ib2xzYXIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gImFuaW8iKSAlPiUNCiAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKGNvbnN1bW9fa19maWpvID0gdmFsb3IgKiBpcGNfMTggKiBjb25zdW1vX2tfZmlqb195cGYsDQogICAgICAgICAgICAgICAgICAgICBmdWVudGUgPSAiQ3JpdGVyaW8gQ0NOTiIsDQogICAgICAgICAgICAgICAgICAgICB2YWxvcl9hZ3JlZ2FkbyA9IHZicF9jcml0ZXJpb19jY25uIC0gY29uc3Vtb19pbnRlcm1lZGlvLA0KICAgICAgICAgICAgICAgICAgICAgbWFzYV9zYWxhcmlhbCA9IG1lYW5fY29lZl9tcyAqIHZicF9jcml0ZXJpb19jY25uLA0KICAgICAgICAgICAgICAgICAgICAgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID12YWxvcl9hZ3JlZ2Fkby0gIG1hc2Ffc2FsYXJpYWwtY29uc3Vtb19rX2Zpam8sDQogICAgICAgICAgICAgICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBmdWVudGUsDQogICAgICAgICAgICAgICAgICAgIHZhbG9yX2JydXRvX3Byb2R1Y2Npb24gPSB2YnBfY3JpdGVyaW9fY2NubiwNCiAgICAgICAgICAgICAgICAgICBjb25zdW1vX2ludGVybWVkaW8sDQogICAgICAgICAgICAgICAgICAgdmFsb3JfYWdyZWdhZG8sDQogICAgICAgICAgICAgICAgICAgbWFzYV9zYWxhcmlhbCwNCiAgICAgICAgICAgICAgICAgICBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24gLCBjb25zdW1vX2tfZmlqbykgJT4lDQogICAgICAgICAgICAgIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgIDQ6bmNvbCguKSkpICU+JQ0KICBiaW5kX3Jvd3ModmJwX2Njbm4gJT4lICMgQ0NOTiBSZWVzdGltYWRvLCB0aWVuZSBkZXNjb250YWRvIHNlcml2aWNpb3MNCiAgICAgICAgICAgICAgI3NlbGVjdCgtY29uc3Vtb19rX2Zpam8pICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKHZhbG9yX2JydXRvX3Byb2R1Y2Npb24gPSB2YnBfZXh0cmFjY2lvbl9jY25uLCANCiAgICAgICAgICAgICAgICAgICBjb25zdW1vX2ludGVybWVkaW8gPSBjaV9leHRyYWNjaW9uX2Njbm4sDQogICAgICAgICAgICAgICAgICAgdmFsb3JfYWdyZWdhZG8gPXZhX2V4dHJhY2Npb25fY2NubiwNCiAgICAgICAgICAgICAgICAgICBtYXNhX3NhbGFyaWFsID1tc19jY25uLA0KICAgICAgICAgICAgICAgICAgIGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiA9ZWJlX2Njbm4pICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAgICAgICAgICAgICAgNDpuY29sKC4pKSkgJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC9pcGNfMTgsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpICU+JQ0KICBzZWxlY3QoLWlwY18xOCkNCnZhbG9yX3RvdGFsX3Byb2R1Y2Npb24NCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI0dyYWZpY28NCmdyYWZfdmFsb3JfcHJvZHVjY2lvbiA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTYwKSAlPiUgDQogIGdncGxvdCggYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjcpKw0KICBnZW9tX3BvaW50KHNpemUgPSAwLjQzNSwgYWxwaGEgPSAwLjIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJWYWxvciBkZSBsYSBQcm9kdWNjacOzbiBoaWRyb2NhcmJ1csOtZmVyYSIsIA0KICAgICAgIHN1YnRpdGxlID0gIlZhbG9yIHRvdGFsIHkgY29tcG9uZW50ZXMiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdncGxvdGx5KGdyYWZfdmFsb3JfcHJvZHVjY2lvbiwgd2lkdGggPSA3NTAsIGhlaWdodCA9IDUwMCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQp2YnBfdmFfY2lfcHJvcGlhICU+JSANCiAgc2VsZWN0KGFuaW8sIHZhbG9yX2JydXRvX2NydWRvLCB2YWxvcl9icnV0b19nYXMpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9ICB2YWxvciwgMjozKSAlPiUgDQogICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgL2lwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikgJT4lIA0KICBzZWxlY3QoLWlwY18xOCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBmaWxsID0gdmFyaWFibGUpKSsNCiAgZ2VvbV9jb2woKSsNCiAgIGxhYnModGl0bGUgPSAiVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24gaGlkcm9jYXJidXLDrWZlcmEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJEZXNhZ3JlZ2FjacOzbiBlbiBwZXRyw7NsZW8geSBnYXMiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKQ0KYGBgDQoNCg0KDQoNCg0KIyBDw6FsY3Vsb3MgZGUgVGFzYSBkZSBHYW5hbmNpYQ0KDQoNCiQkVEdfe2hpZHJvY2FyYnVyb3N9ID0gXGZyYWN7UFZfe2hpZHJvY2FyYnVyw61mZXJhfX17S1RBX3toaWRyb2NhcmJ1csOtZmVyb319JCQNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI2xldmFudG8gZGF0YSBzZXRzIGRlIG90cm8gUiBtYXJrZG93bg0KYmFsYW5jZXNfYXJnIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoZmVjaGEgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJVktJW0tJWQiKSwgWDEgPSBjb2xfc2tpcCgpKSkNCg0KcGV0cm9icmFzX2FyZ19zZWdtZW50b3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9wZXRyb2JyYXNfYXJnX3NlZ21lbnRvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCnlwZl9zZWdtZW50b3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy95cGZfc2VnbWVudG9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl90Z19lbXAgPC0gYmFsYW5jZXNfYXJnICU+JQ0KICBmaWx0ZXIodGdfYW50ICE9IEluZikgJT4lIA0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0Z19hbnQsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBlbXByZXNhcyBoaWRyb2NhcmJ1cm9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICAiQW50ZXMgZGUgaW1wdWVzdG9zIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yKQ0KDQpnZ3Bsb3RseShncmFmX3RnX2VtcCwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl90Z195cGYgPC0geXBmX3NlZyAlPiUgDQogICMgZmlsdGVyKHNlY3RvciAlaW4lIGMoInF1aW1pY2EiLCAiZG93bnN0cmVhbSIsICJ1cHN0cmVhbSIpKSAlPiUNCiAgZmlsdGVyKHNlY3RvciAhPSAiYWRtX2NlbnRyYWwiKSAlPiUNCiAgZ2dwbG90KGFlcyhmZWNoYSwgdGdfYWN0aXZvLCBjb2xvciA9IHNlY3RvcikpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgIyBmYWNldF93cmFwKH5zZWN0b3IpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgZGUgc2VnbWVudG9zIFlQRiIpDQpncmFmX3RnX3lwZg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfdGdfcGV0cm9icmFzIDwtIHBldHJvYnJhc19hcl9zZWcgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygicGV0cm9xdWltaWNhIiwgImRvd25zdHJlYW0iLCAidXBzdHJlYW0iLCAiZ2FzX3lfZW5lcmdpYSIpKSAlPiUNCiAgIyBmaWx0ZXIoc2VjdG9yICE9ICJhZG1fY2VudHJhbCIpICU+JQ0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0ZywgY29sb3IgPSBzZWN0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogICMgZmFjZXRfd3JhcCh+c2VjdG9yKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGRlIHNlZ21lbnRvcyBQZXRyb2JyYXMgQXJnZW50aW5hIikNCmdyYWZfdGdfcGV0cm9icmFzDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICAgLGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQ0KI0VzdGltYWNpw7NuIGRlIHRhc2EgZGUgZ2FuYW5jaWEgdG90YWwgcmFtYQ0KDQp0YXNhX2dhbmFuY2lhX3JhbWFfZmx1am8gPC0gdmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24iICYgZnVlbnRlID09ICJDcml0ZXJpbyBwcm9waW8gY29uIFZCUCBDQ05OIiApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID0gdmFsb3IpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX3lfcG96b3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHBweWUgPSBwcHllX2VzdGltYWRvLCBzdG9ja19zZWxlY2Npb25hZG8gPSBmdWVudGVfcHB5ZSwgZnVlbnRlX3Bvem8pLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbXV0YXRlKHRhc2FfZ2FuYW5jaWEgPSBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24vcHB5ZSkNCg0KZ3JhZl90Z19yYW1hXzEgPC0gdGFzYV9nYW5hbmNpYV9yYW1hX2ZsdWpvICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB0YXNhX2dhbmFuY2lhLCBjb2xvciA9ZnVlbnRlX3Bvem8gKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuNSkrDQogIGdlb21fcG9pbnQoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBoaWRyb2NhcmJ1csOtZmVyYSBjb24gUFB5RSBhIHBhcnRpciBkZSBmbHVqbyBkZSBwb3pvcygxOTYwIC0gMjAxOCkiKSsNCiAgZmFjZXRfd3JhcCh+c3RvY2tfc2VsZWNjaW9uYWRvKQ0KIyBnZ3Bsb3RseShncmFmX3RnX3JhbWFfMSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCmdyYWZfdGdfcmFtYV8xDQoNCiMjIyMjIyMjIyMjIw0KDQojICNlbCBERiB0YXNhX2dhbmFuY2lhX3JhbWFfc3RvY2sgY29udGllbmUgbGFzIGVzdGltYWNpb25lcyBkaXN0aW50YXMgZXN0aW1hY2lvbmVzIGRlIEtUQSBjb24gc3RvY2sgZGUgcG96b3MgDQojIHRhc2FfZ2FuYW5jaWFfcmFtYV9zdG9jayA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JQ0KIyAgIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uIiAmIGZ1ZW50ZSA9PSAiQ3JpdGVyaW8gcHJvcGlvIGNvbiBWQlAgQ0NOTiIgKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uID0gdmFsb3IpICU+JSANCiMgICBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lIA0KIyAgICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygicHB5ZV9lc3RpbWFkb19hZmlwIiwgInBweWVfZXN0aW1hZG9fYm9sc2FyIiwNCiMgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgInBweWVfZXN0aW1hZG9fdG90YWwiKSkgJT4lDQojICAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInBweWVfZXN0aW1hZG9fYm9sc2FyIikgJT4lDQojICAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInBweWVfZXN0aW1hZG9fdG90YWwiKSAlPiUNCiMgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCAgcHB5ZSA9IHZhbG9yLCBzdG9ja19zZWxlY2Npb25hZG8gPSBmdWVudGVfcHB5ZSkgJT4lIA0KIyAgICAgICAgICAgICAgIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKSAlPiUgDQojICAgbXV0YXRlKHRhc2FfZ2FuYW5jaWEgPSBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24vcHB5ZSkNCiMgDQojIGdyYWZfdGdfcmFtYV8yIDwtIHRhc2FfZ2FuYW5jaWFfcmFtYV9zdG9jayAlPiUgDQojICAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHRhc2FfZ2FuYW5jaWEsIGNvbG9yID0gc3RvY2tfc2VsZWNjaW9uYWRvKSkrDQojICAgZ2VvbV9saW5lKGFscGhhID0gMC41KSsNCiMgICBnZW9tX3BvaW50KCkrDQojICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQojICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBoaWRyb2NhcmJ1csOtZmVyYSBjb24gUFB5RSBhIHBhcnRpciBkZSBzdG9jayBkZSBwb3pvcyAoMTk2MCAtIDIwMTgpIikNCiMgIyBnZ3Bsb3RseShncmFmX3RnX3JhbWFfMiwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCiMgZ3JhZl90Z19yYW1hXzINCg0KYGBgDQoNCiMjIFJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIGVtcHJlc2FzIGRlIGxhIHJhbWENCg0KTGEgcmVudGEgYXByb3BpYWRhIHBvciBsYXMgZW1wcmVzYXMgZGUgbGEgcmFtYSBzZSBjYWxjdWxhIHBvciBtZWRpbyBkZWwgZGlmZXJlbmNpYWwgZGUgdGFzYXMgZGUgZ2FuYW5jaWEgZW50cmUgZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIHF1ZSBzdXJnZSBhIHBhcnRpciBkZSBsb3MgYmFsYW5jZXMgeSBsYSByZW50YWJpbGlkYWQgbm9ybWFsIGRlIGxhIGVjb25vbcOtYS4NCg0KJCRSZW50YVxfZW1wcmVzYXMgPSBLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSAqIChUR197aGlkcm9jYXJidXLDrWZlcmF9IC0gVEdfe3JlZmVyZW5jaWF9KSQkDQokJFRHX3toaWRyb2NhcmJ1csOtZmVyYX0gPSBcZnJhY3tHY2lhX3toaWRyb2NhcmJ1cm9zfX17S1RBX3toaWRyb2NhcmJ1csOtZmVyb319JCQgDQpQb3IgbG8gY3VhbCwgbGEgcmVudGEgYXByb3BpYWRhIHBvciBsYXMgZW1wcmVzYXMgZGUgbGEgcmFtYSBzZXLDrWEgZXF1aXZhbGVudGUgYToNCg0KJCRSZW50YVxfZW1wcmVzYXMgPSBHY2lhX3toaWRyb2NhcmJ1cm9zfSAtIEtUQV97aGlkcm9jYXJidXLDrWZlcm99ICogIFRHX3tyZWZlcmVuY2lhfSQkDQoNCkRvbmRlOg0KDQoqICRLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSQgPSBTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8gZGUgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzDQoqICRUR197aGlkcm9jYXJidXLDrWZlcmF9JCA9IFRhc2EgZGUgZ2FuYW5jaWEgZGUgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzDQoqICRUR197cmVmZXJlbmNpYX0kID0gVGFzYSBkZSBnYW5hbmNpYSBkZSByZWZlcmVuY2lhDQoqICRHY2lhX3toaWRyb2NhcmJ1cm9zfSQgPSBHYW5hbmNpYSBkZSBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KICANCnRnX2luZHVzdHJpYWwgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9URy90Z19pbmR1c3RyaWFsLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkNCg0KcmVudGFfdGcgPC0gIHRhc2FfZ2FuYW5jaWFfcmFtYV9mbHVqbyAlPiUNCiAgc2VsZWN0KGFuaW8sICBzdG9ja19zZWxlY2Npb25hZG8sIGZ1ZW50ZV9wb3pvLCBwcHllICwgdGFzYV9nYW5hbmNpYSkgJT4lIA0KICBmaWx0ZXIoc3RvY2tfc2VsZWNjaW9uYWRvID09ICJwcHllX2JvbHNhciIsZnVlbnRlX3Bvem8gPT0gInBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhIiApICU+JSANCiAgbGVmdF9qb2luKHRnX2luZHVzdHJpYWwsIGJ5ID0gImFuaW8iKSAlPiUgDQogIHJlbmFtZSh0Z19oaWRyb2NhcmJ1cm9zID0gdGFzYV9nYW5hbmNpYSkgJT4lIA0KICBtdXRhdGUocmVudGFfY29uX3RnX2ppYyA9IHBweWUgKih0Z19oaWRyb2NhcmJ1cm9zIC0gdGdfaW5kdV9qaWMpLA0KICAgICAgICAgcmVudGFfY29uX3RnX2VtID0gcHB5ZSAqKHRnX2hpZHJvY2FyYnVyb3MgLSB0Z19pbmR1X2VtKSwNCiAgICAgICAgIHVuaW9uX3RnID0gY2FzZV93aGVuKGFuaW8gPCAxOTkzIH4gdGdfaW5kdV9qaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTMgfiB0Z19pbmR1X2VtKSkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCmdyYWZfdGdfcmFtYSA8LSByZW50YV90ZyAlPiUNCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHJlbnRhLA0KICAgICAgICAgODo5KSAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ImRvZGdlIikrDQogICMgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHBvciBkaWZlcmVuY2lhbCBkZSB0YXNhcyBkZSBnYW5hbmNpYSIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KZ2dwbG90bHkoZ3JhZl90Z19yYW1hLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVudGFfZW1wcmVzYXNfYmFsYW5jZXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9yZW50YV9lbXByZXNhLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgDQoNCnJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgPC0gIHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzICU+JSANCiAgZmlsdGVyKCEoZW1wcmVzYSAlaW4lIGMoImNoZXZyb24iLCAicGV0cm9icmFzX2dsb2IiICkpLA0KICAgICAgICAgc2VjdG9yICVpbiUgYyggImludGVncmFkYSIsICJwcm9kdWNjaW9uIikNCiAgICAgICAgICkgJT4lIA0KICBncm91cF9ieShmZWNoYSwgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShLVEEgPSBzdW0oS1RBLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgZ2FuYW5jaWFfZW1wcmVzYXNfYW50ZXNfaW1wdWVzdG9zID0gc3VtKGdjaWFfYW50LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgZ2FuYW5jaWFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MgPSBzdW0oZ2NpYV9kZXNwLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcmVudGFfZW1wcmVzYXNfYW50ZXNfaW1wdWVzdG9zID0gc3VtKHJlbnRhX2FudF9jb3JyLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MgPSBzdW0ocmVudGFfZGVzcF9jb3JyLCBuYS5ybSA9IFQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSggYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBldmVyeXRoaW5nKC4pLCAtZmVjaGEpDQoNCmdyYWZfcmVudGFfZW1wIDwtIHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzICU+JQ0KICBmaWx0ZXIoc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQogIGZpbHRlcighaXMubmEocmVudGFfZGVzcF9wMTgpLA0KICAgICAgICAgIShlbXByZXNhICVpbiUgYygiY2hldnJvbl9nbG9iYWwiLCAicGV0cm9icmFzX2dsb2JhbCIgKSkpICU+JSANCiAgZ2dwbG90KGFlcyhmZWNoYSwgcmVudGFfZGVzcF9wMTgsIGZpbGwgPSBlbXByZXNhKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBwb3IgZW1wcmVzYSIsDQogICAgICAgc3VidGl0bGUgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpKw0KICBmYWNldF93cmFwKH5zZWN0b3IpDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfZW1wLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmVqZXJjaWNpbyA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJ2YWxvcl9hZ3JlZ2FkbyIpICU+JSANCiAgIyBmdWxsX2pvaW4oc3RvY2tfcmFtYSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmFtYSA9IHNlY3RvciwgYWN0aXZvcyA9IHZhcmlhYmxlLCB2YWxvcl9hY3Rpdm9zID0gdmFsb3IsIA0KICAjICAgICAgICAgICAgICAgICAgICBmdWVudGVfYWN0aXZvcyA9IGZ1ZW50ZSkgJT4lIA0KICAjICAgICAgICAgICAgICMgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJBRklQIikpJT4lDQogICMgICAgICAgICAgICAgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJCb2xzYXIiKSklPiUNCiAgZnVsbF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmFtYSA9IHNlY3RvciwgYWN0aXZvcyA9IHZhcmlhYmxlLCB2YWxvcl9hY3Rpdm9zID0gdmFsb3IpKSAlPiUgDQogICAgICAgICAgICAgICMgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJCb2xzYXIiKSklPiUNCiAgbXV0YXRlKHJlbGFjaW9uID0gdmFsb3JfYWN0aXZvcy92YWxvcikgJT4lIA0KICBmaWx0ZXIoYW5pbyA+IDE5OTAsICEoaXMubmEoYWN0aXZvcykpKQ0KZWplcmNpY2lvICAgICAgICAgICAgDQogIA0KZ3JhZl9yZWxhY2lvbiA8LSBlamVyY2ljaW8gJT4lIA0KICAjIGdncGxvdCggYWVzKGFuaW8sIHJlbGFjaW9uLCBjb2xvciA9IHJhbWEpKSsNCiAgZ2dwbG90KCBhZXMoYW5pbywgcmVsYWNpb24sIGNvbG9yID0gZnVlbnRlKSkrDQogICMgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiQWN0aXZvIHNvYnJlIHZhbG9yIGFncmVnYWRvIikrDQogIGZhY2V0X3dyYXAofmFjdGl2b3MpIA0KDQpnZ3Bsb3RseShncmFmX3JlbGFjaW9uLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQoNCmBgYA0KDQoNCg0KIyBSZW50YSBwb3IgZWwgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBlbnRyZSBlbCBtZXJjYWRvIGludGVybm8geSBsYXMgcmVmZXJlbmNpYXMgaW50ZXJuYWNpb25hbGVzIA0KDQpSZW50YSBhcHJvcGlhZGEgbWVkaWFudGUgZWwgYWJhcmF0YW1pZW50byBlbiBlbCBjb25zdW1vIGludGVybm8gcG9yIGVmZWN0byBkZWwgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vL2V4dGVybm8sIHNvYnJldmFsdWFjacOzbiBkZSBsYSBtb25lZGEgeSByZXRlbmNpb25lcyBhIGxhIGV4cG9ydGFjacOzbg0KDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBKSyAodmFyaWFibGUgJ3JlbnRhX2RpZl9wcmVjaW9zJykNCg0KJCRSRFA9IFByb2RJbnQgKiBQZXh0ICogVENQIC0gUHJvZEludCAqIFBNSSAqIFRDQyQkDQoNCkRvbmRlOg0KDQoqICRSRFAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlZmVjdG8gZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vL2V4dGVybm8geSBzb2JyZXZhbHVhY2nDs24NCiogJE1kb0ludCQgPSBQcm9kdWNjacOzbiBkZXN0aW5hZGEgYWwgTWVyY2FkbyBJbnRlcm5vOiBQcm9kdWNjacOzbiAtIEV4cG9ydGFjaW9uZXMgLSBFeGlzdGVuY2lhcyAoYmFycmlsZXMgZGUgcGV0csOzbGVvIMOzIE1NQlRVKQ0KKiAkUGV4dCQgPSBQcmVjaW8gZGUgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBleHRlcm5vIChVU0QpDQoqICRQTUkkID0gUHJlY2lvIGRlIHZlbnRhIGRlbCBtZXJjYWRvIGludGVybm8gKFVTRCkNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBKSUMgeSBjaWEgKHZhcmlhYmxlICdyZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uJykNCiQkUkRQID0gTWRvSW50ICogUE1JICogKFxmcmFje1RDUH17VENDfSAgLSAxKSQkICANCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPC0gcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICMgZmlsdGVyKGFuaW8gPiAxOTkwKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByb2RfY3J1ZG8pICU+JSANCiAgbGVmdF9qb2luKGV4cG9fcV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fY3J1ZG8pKSAlPiUgI3VuaW9uIGNvbiBleHBvDQogIGxlZnRfam9pbihleGlzdGVuY2lhc19wZXRyb2xlbykgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhpc3RlbmNpYXNfY3J1ZG89MCApKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleHBvX2NydWRvPTAgKSkgJT4lIA0KICAjIG11dGF0ZShwcm9kX21kb19pbnRlcm5vID0gcHJvZF9jcnVkbyAtIGV4cG9fY3J1ZG8gLSBleGlzdGVuY2lhc19jcnVkbykgJT4lIA0KICBtdXRhdGUocHJvZF9tZG9faW50ZXJubyA9IHByb2RfY3J1ZG8gLSBleHBvX2NydWRvICkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19jcnVkb19tZG9pbnQpLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSAgIyB1bm8gY29uIHByZWNpbyBpbnRlcm5vDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGJyZW50ID0gY2FzZV93aGVuKGFuaW8gPCAxOTg3IH4gYnJlbnRfaGlzdG9yaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5ODcgfiBicmVudF9pZWEgKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21lX2NydWRvLCBicmVudCApLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSAgICMgdW5vIGNvbiBwcmVjaW8gZXh0ZXJubyANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19tZV9jcnVkbyp0Y3AgLSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQqdGNjLA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgPSBwcm9kX21kb19pbnRlcm5vKmJyZW50KnRjcCAtIHByb2RfbWRvX2ludGVybm8qcHJlY2lvX2NydWRvX21kb2ludCp0Y2MsDQogICAgICAgICAjIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gPSBwcm9kX21kb19pbnRlcm5vICpwcmVjaW9fY3J1ZG9fbWRvaW50KHRjcC90Y2MtMSksDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gInVzZCIsIHVuaWRhZF9yZW50YSA9ICJwZXNvc19jb3JyIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkPSB1bmlkYWQgLCBwcm9kX2NydWRvLCBleHBvX2NydWRvLCBleGlzdGVuY2lhc19jcnVkbywgcHJvZF9tZG9faW50ZXJubywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19pbnRlcm5vX2NydWRvID0gcHJlY2lvX2NydWRvX21kb2ludCwgcHJlY2lvX2V4dGVybm9fY3J1ZG8gPSBwcmVjaW9fbWVfY3J1ZG8sDQogICAgICAgICAgdGNjLCB0Y3AsIHVuaWRhZF9yZW50YSwgDQogICAgICAgICAjIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fY3J1ZG8gPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uLA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50KSANCg0KDQoNCg0KZ3JhZl9kaWZfY3J1ZG8gPC0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ID0gcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQvaXBjXzE4KSAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIHNlbGVjdChhbmlvLCAxMjpuY29sKC4pICkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOjQpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyAxMF42KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIHBldHJvbGVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vIHkgZXh0ZXJubyIsDQogICAgICAgeSA9ICJNTSBkZSBwZXNvcyBkZSAyMDE4IikNCmdyYWZfZGlmX2NydWRvDQoNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcm9kX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19xX2dhc19NTUJUVSAlPiUgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19nYXMpKSAlPiUgDQogIG11dGF0ZShleHBvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19nYXMsIDAgKSwNCiAgICAgICAgcHJvZF9tZG9faW50ZXJubyA9IHByb2RfZ2FzIC0gZXhwb19nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2dhc19NTUJUVSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBwcmVjaW9faW50ZXJub19nYXMgPSAgcHJlY2lvX2dhc19tZG9pbnQpLA0KICAgICAgICAgICAgYnkgPSAiYW5pbyIpICU+JSAgIyB1bm8gY29uIHByZWNpbyBpbnRlcm5vDQogIGxlZnRfam9pbihwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZXh0ZXJub19nYXMpLCANCiAgICAgICAgICAgIGJ5ID0gImFuaW8iKSAlPiUgICAjIHVubyBjb24gcHJlY2lvIGV4dGVybm8NCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSgNCiAgICBwcmVjaW9faW50ZXJub19nYXMgPSBwcmVjaW9faW50ZXJub19nYXMvIHRjYywNCiAgICByZW50YV9kaWZfcHJlY2lvc19nYXMgPSBwcm9kX21kb19pbnRlcm5vICogdGNwICogcHJlY2lvX2V4dGVybm9fZ2FzDQogICAgICAtIHByb2RfbWRvX2ludGVybm8gKiB0Y2MgKiBwcmVjaW9faW50ZXJub19nYXMgLA0KICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gPSBwcm9kX21kb19pbnRlcm5vICogcHJlY2lvX2ludGVybm9fZ2FzKih0Y3AvdGNjLTEpLA0KICAgICAgdW5pZGFkX3ByZWNpbyA9ICJ1c2QiLCB1bmlkYWRfcmVudGEgPSAicGVzb3NfY29yciIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZD0gdW5pZGFkICwgcHJvZF9nYXMsIGV4cG9fZ2FzLCBwcm9kX21kb19pbnRlcm5vLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19pbnRlcm5vX2dhcywgcHJlY2lvX2V4dGVybm9fZ2FzLCB0Y2MsIHRjcCwNCiAgICAgICAgIHVuaWRhZF9yZW50YSwgcmVudGFfZGlmX3ByZWNpb3NfZ2FzLCByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcyA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gKQ0KcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMNCg0KDQoNCmdyYWZfZGlmX2dhcyA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMvaXBjXzE4LA0KICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMgPSANCiAgICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvaXBjXzE4KSAlPiUNCiAgICBzZWxlY3QoYW5pbywgMTE6bmNvbCguKSApICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzo0KSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC8gMTBeNikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBnYXPDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJubyB5IGV4dGVybm8iLA0KICAgICAgIHkgPSAiTU0gZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB4bGltKDE5NjAsIDIwMjEpDQpncmFmX2RpZl9nYXMNCg0KDQoNCmBgYA0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3Igc29icmV2YWx1YWNpw7NuIGNhbWJpYXJpYQ0KDQoNCiQkUnNvYnJldmFsdWFjaW9uID0gRXhwbyAqIFBleHQgKiAoVENQIC0gVENDKSQkIA0KDQpEb25kZToNCiogJFJzb2JyZXZhbHVhY2lvbiQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGV4cG9ydGFjaW9uZXMgY29uIHRpcG8gZGUgY2FtYmlvIHNvYnJldmFsdWFkbw0KKiAkRXhwbyQgPSBFeHBvcnRhY2lvbmVzICAoYmFycmlsZXMgZGUgcGV0csOzbGVvIMOzIE1NQlRVKQ0KKiAkUGV4dCQgPSBQcmVjaW8gZGUgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBleHRlcm5vIChVU0QpDQoqICRUQ1AkID0gVGlwbyBkZSBDYW1iaW8gZGUgUGFyaWRhZA0KKiAkVENDJCA9IFRpcG8gZGUgQ2FtYmlvIENvbWVyY2lhbA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcmVudGFfdGNwX2NydWRvIDwtICByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAlPiUNCiAgbGVmdF9qb2luKGV4cG9fdXNkX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fY3J1ZG9fdXNkID0gZXhwb19jcnVkbywgdW5pZGFkX2V4cG8gPSB1bmlkYWQgKSkgJT4lIA0KICAgbXV0YXRlKHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvID0gZXhwb19jcnVkbypwcmVjaW9fZXh0ZXJub19jcnVkbyp0Y3AgLSBleHBvX2NydWRvKnByZWNpb19leHRlcm5vX2NydWRvKnRjYywNCiAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb192YWxvciA9IGV4cG9fY3J1ZG9fdXNkKiB0Y3AgLSBleHBvX2NydWRvX3VzZCogdGNjLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAidXNkIiwgdW5pZGFkX3JlbnRhID0gInBlc29zX2NvcnIiLA0KICAgICAgICAgZGlmID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8vcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fdmFsb3ItMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkICwgZXhwb19jcnVkbywNCiAgICAgICAgIHVuaWRhZF9leHBvLCBleHBvX2NydWRvX3VzZCwNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19leHRlcm5vX2NydWRvICwNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvX3ZhbG9yLCBkaWYpICANCnJlbnRhX3RjcF9jcnVkbw0KDQpyZW50YV90Y3BfZ2FzIDwtICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQogICBtdXRhdGUocmVudGFfc29icmV2YWx1YWNpb25fZ2FzID0gZXhwb19nYXMqcHJlY2lvX2V4dGVybm9fZ2FzKnRjcCAtIGV4cG9fZ2FzKnByZWNpb19leHRlcm5vX2dhcyp0Y2MsDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gInVzZCIsIHVuaWRhZF9yZW50YSA9ICJwZXNvc19jb3JyIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkICwgZXhwb19nYXMsIA0KICAgICAgICAgdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4dGVybm9fZ2FzICwNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzKSAgDQoNCg0KDQpgYGANCg0KDQoNCiMgUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpyZXRlbmNpb25lc19jYW1wb2RvbmljbyA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZXRlbmNpb25lcy54bHN4IiAsIA0KICAgIHNoZWV0ID0gInVzZCIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb25lc19oYyA9IHJldGVuY2lvbmVzX2hnICogVENDICogMTAwMDAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHJldGVuY2lvbmVzX2hjKQ0KDQpyZXRlbmNpb25lc19jcnVkbyA8LSByZWFkX2V4Y2VsKCAiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmV0ZW5jaW9uZXMueGxzeCIgKSAlPiUNCiAgcmVuYW1lKHJldGVuY2lvbmVzX2NydWRvX2prID0gcmV0ZW5jaW9uZXNfamssDQogICAgICAgICByZXRlbmNpb25lc19jcnVkb19iZnIgPSAicmV0ZW5jaW9uZXNfYmZyX00kMjAwOCIpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbmVzX2NydWRvX2JmciA9IHJldGVuY2lvbmVzX2NydWRvX2JmciAqIGlwYzA4X2JmciAqIDEwMDAgLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KC1pcGMwOF9iZnIpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NhbXBvZG9uaWNvKQ0KDQoNCnJlbnRlbmNpb25lc19yZWdhbGlhcyA8LSByZWdhbGlhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UocmVnYWxpYXNfdG90YWwgPSBzdW0ocmVnYWxpYXNfdG90YWwsIG5hLnJtID0gVCkpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NydWRvICU+JSBzZWxlY3QoLWMocmV0ZW5jaW9uZXNfY3J1ZG9fYmZyLCByZXRlbmNpb25lc19oYykpKSANCg0KDQoNCnJldGVuY2lvbmVzX2NydWRvDQoNCg0KYGBgDQoNCg0KDQoNCiQkUmltcCA9IFJFICsgUmVnJCQNCg0KRG9uZGU6DQoNCiogJFJpbXAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KKiAkUkUkID0gUmV0ZW5jaW9uZXMNCiogJFJlZyQgPSBSZWdhbGlhcw0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3IgY29uc3VtaWRvcmVzIHkgcmVmaW5lcsOtYXMgeSBwcm9jZXNhZG9yYXMNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIFJhbcOzbiAoMjAxOSkNCg0KIyMjIyBSZWZpbmVyw61hcyB5IHByb2Nlc2Fkb3Jhcw0KDQokJFJSID0gKFBJIC0gUFJNaSkgKiBDcnVkb1AkJA0KDQoNCg0KKiAkUlIkID0gUmVudGEgYXByb3BpYWRhIHBvciBsYXMgUmVmaW5hZG9yYXMgDQoqICRQSSQgPSBwcm9tZWRpbyBwb25kZXJhZG8gZGUgUHJlY2lvcyBJbnRlcm5hY2lvbmFsZXMgDQoqICRQUk1pJCA9IFByZWNpbyBwb25kZXJhZG8gYSBSZWZpbmVyw61hcyBkZWwgTWVyY2FkbyBJbnRlcm5vDQoqICRDcnVkb1AkID0gYmFycmlsZXMgZGUgQ3J1ZG8gUHJvY2VzYWRvIHBvciBsYXMgcmVmaW5hZG9yYXMNCg0KIyMjIyBDb25zdW1pZG9yZXMNCg0KJCRSQyA9IChQSSAtIFBSTWkgLSBNUikgKiBDcnVkb1AgJCQNCg0KKiAkUkMkID0gUmVudGEgYXByb3BpYWRhIHBvciBsb3MgQ29uc3VtaWRvcmVzDQoqICRNUiQgPSBNYXJnZW4gZGUgUmVmaW5lcsOtYXMNCg0KRXN0byByZXN1bHRhIGVxdWl2YWxlbnRlIGEgcGxhbnRlYXI6DQoNCiQkUkMgPSBQQ01pICogQ3J1ZG9QJCQNCg0KKiAkUENNaSQgPSBQcmVjaW8gcG9uZGVyYWRvIGEgQ29uc3VtaWRvcmVzIGRlbCBNZXJjYWRvIEludGVybm8uDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCmBgYA0KDQoNCg0KDQojIFJlbnRhIEhpZHJvY2FyYnVyw61mZXJhIFRvdGFsLiBFbiBwcmVjaW9zIGNvbnN0YW50ZXMsIHNvYnJlIFBsdXN2YWzDrWEgVG90YWwgeSBQQkkNCg0KRXhpc3RlbiBkb3MgY2FtaW5vcyBwYXJhIGxsZWdhciBhbCBtb250byB0b3RhbCBkZSByZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmE6IHVubyBlcyBkZXNjb250YW5kbyBsYSBnYW5hbmNpYSBub3JtYWwgZGUgbGFzIGVtcHJlc2FzIGEgbGEgcGx1c3ZhbMOtYSB0b3RhbCBkZWwgc2VjdG9yIHkgZWwgb3RybyBlcyBwb3IgbWVkaW8gZGUgbGEgc3VtYSBkZSBtZWNhbmlzbW9zIGRlIGFwcm9waWFjacOzbi4NCg0KJCRSZW50YVxfaGlkcm9jYXJidXLDrWZlcmEgPSBQVl97aGlkcm9jYXJidXLDrWZlcmF9IC0gR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0kJA0KRG9uZGU6DQoNCiogJEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9JCA9IEdhbmFuY2lhIE5vcm1hbCBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvDQoqICRQVl97aGlkcm9jYXJidXLDrWZlcmF9JCA9IFBsdXN2YWzDrWEgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyAgDQoNCiQkR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0gPSBLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSAqIFRHX3tyZWZlcmVuY2lhfSQkDQoNCg0KRG9uZGU6DQoNCiogJEtUQV97aGlkcm9jYXJidXJvc30kID0gU3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8gDQoqICRUR197cmVmZXJlbmNpYX0kID0gVGFzYSBkZSBnYW5hbmNpYSBub3JtYWwgZGUgcmVmZXJlbmNpYS4NCg0KRW4gZXN0ZSBjYXNvLCBzZWxlY2Npb25hbW9zIGxhIHRhc2EgZGUgZ2FuYW5jaWEgZGVsIHNlY3RvciBpbmR1c3RyaWFsIGNvbW8gcGFyw6FtZXRybyBwYXJhIGRpZmVyZW5jaWFyIGxhIHJlbnRhIGRlIGxhIGdhbmFuY2lhLiBBIHN1IHZleiwgcGFyYSBlbCBjYXBpdGFsIHRvdGFsIGFkZWxhbnRhZG8gZGUgbGFzIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcywgc2VsZWNjaW9uYW1vcyB1bmljYW1lbnRlIGVsIHZhbG9yIHJlc3VsdGFudGUgZGUgbGEgZXN0aW1hY2nDs24gZGUgbGEgUFB5RSBkZSBCb2xzYXIgYSBwYXJ0aXIgZGVsIGluZGljZSBkZSBmbHVqbyBkZSBwb3pvcyAodmFyaWFibGUgInBweWVfYm9sc2FyX2ZsdWpvIiksIHBvciBsbyBxdWUgbGUgZmFsdGFuIGxvcyBpbnZlbnRhcmlvcyB5IHNhbGFyaW9zIGFkZWxhbnRhZG9zLg0KDQpFbCBjw6FsY3VsbyBkZSByZW50YSB0b3RhbCBoaWRyb2NhcmJ1csOtZmVyYSBxdWUgc2Ugb2J0aWVuZSBwb3IgbWVkaW8gZGUgZGVzY29udGFyIGxhIGdhbmFuY2lhIG5vcm1hbCBhIGxhIHBsdXN2YWzDrWEgdG90YWwgZGVsIHNlY3RvciwgZGViZSBzZXIgaWd1YWwgYSBsYSByZW50YSBvYnRlbmlkYSBwb3IgbWVkaW8gZGUgbGEgYWdyZWdhY2nDs24gZGUgbG9zIGRpc3RpbnRvcyBtZWNhbmlzbW9zIGRlIGFwcm9waWFjacOzbi4gRXMgZGVjaXI6DQoNCiQkUmVudGFcX2hpZHJvY2FyYnVyw61mZXJhID0gUmVudGFcX2RpZmVyZW5jaWFsXF9wcmVjaW9zICsgUmVudGFcX3NvYnJldmFsdWFjacOzbiArIFJlbnRhXF9lbXByZXNhcyArIEltcHVlc3Rvc1xfbmV0b3NcX2VzcGVjw61maWNvcyAkJA0KJCRJbXB1ZXN0b3NcX25ldG9zXF9lc3BlY8OtZmljb3MgPSBSZXRlbmNpb25lcyArIFJlZ2Fsw61hcyAtIFN1YnNpZGlvcyQkDQoNCiMjIFJlbnRhIHRvdGFsIGEgcGFydGlyIGRlIGRlc2N1ZW50b3Mgc29icmUgZWwgVkJQDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIGtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPSBUUlVFLGZpZy53aWR0aCA9IDEyMCxmaWcuaGVpZ2h0ID0gNDAwKQ0KDQoNCnJlbnRhX2hpZHJvY2FyYnVyaWZlcmFfdG90YWwgPC0gcmVudGFfdGcgJT4lIA0KICBzZWxlY3QoYW5pbywgc3RvY2tfc2VsZWNjaW9uYWRvLCBwcHllLA0KICAgICAgICAgdGdfaGlkcm9jYXJidXJvcywgdW5pb25fdGcpICU+JSANCiAgbGVmdF9qb2luKHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGUgPT0gImV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiIpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiA9IHZhbG9yKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyh2YXJpYWJsZSwgdW5pZGFkKSkgJT4lIA0KICAgICAgICAgICAgICByZW5hbWUoZnVlbnRlX2djaWEgPSBmdWVudGUpKSAlPiUgDQogIGxlZnRfam9pbihzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyAlPiUgDQogICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCBieSA9ImFuaW8iKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHN1YnNpZGlvcyA9IChzdWJzaWRpb3NfZWplcy8xMF42KS9pcGNfMTgsIA0KICAgICAgICAgICAgICAgICAgICAgc3Vic2lkaW9zID1yZXBsYWNlX25hKHN1YnNpZGlvcywgMCkgKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBzdWJzaWRpb3MpKSAlPiUgDQogIG11dGF0ZShyZW50YV9jb25fdW5pb25fdGcgPSBwcHllKiAodGdfaGlkcm9jYXJidXJvcyAtIHVuaW9uX3RnKSwNCiAgICAgICAgIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MgPSBwcHllICogdW5pb25fdGcsDQogICAgICAgICByZW50YV90b3RhbCA9IGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiAtIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MgLXN1YnNpZGlvcyApDQpyZW50YV9oaWRyb2NhcmJ1cmlmZXJhX3RvdGFsDQoNCnJlbnRhX2hpZHJvY2FyYnVyaWZlcmFfdG90YWwgJT4lDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcmVudGFfdG90YWwpKSsgDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIGEgcGFydGlyIGRlIGVzdGltYWNpw7NuIHByb3BpYSBkZWwgVkJQIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBmYWNldF93cmFwKH5mdWVudGVfZ2NpYSkNCg0KDQoNCnJlbnRhX3RvdGFsX3BiaV9wdiA8LSByZW50YV9oaWRyb2NhcmJ1cmlmZXJhX3RvdGFsICU+JSANCiAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpICU+JSByZW5hbWUodW5pZGFkX3BiaV9nY2lhID0gdW5pZGFkKSwgIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCAgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHJlbnRhX3B2ID0ocmVudGFfdG90YWwqaXBjXzE4ICkvZ2FuYW5jaWEsIA0KICAgICAgICAgcmVudGFfcGJpID0ocmVudGFfdG90YWwqaXBjXzE4ICkvcGJpICkNCg0KDQpncmFmX3JlbnRhX3RvdGFsX3BiaV9wdiA8LSByZW50YV90b3RhbF9wYmlfcHYgJT4lIA0KICBzZWxlY3QoYW5pbywgZnVlbnRlX2djaWEsIHJlbnRhX3B2LHJlbnRhX3BiaSApICU+JQ0KICAjIGZpbHRlcihhbmlvID49IDE5NjIsIGZ1ZW50ZV9nY2lhID09ICJQcm9waWEiKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6NCkgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IpKSsNCiAgIyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBnZW9tX2xpbmUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KICAgICAgIHNidXRpdGxlID0gIkEgcGFydGlyIGRlIGVzdGltYWNpw7NuIHByb3BpYSBkZWwgVkJQIiwNCiAgICAgICB5ID0gIiUiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMikpKw0KICBmYWNldF9ncmlkKGZ1ZW50ZV9nY2lhfnRpcG9fcmVudGEgKQ0KDQojIGdyYWZfcmVudGFfdG90YWxfcGJpX3B2DQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX3BiaV9wdiwgaGVpZ2h0ID0gNDAwLCB3aWR0aCA9IDYwMCkNCg0KYGBgDQoNCg0KIyMgUmVudGEgdG90YWwgYSBwYXJ0aXIgZGUgc3VtYSBkZSBtZWNhbmlzbW9zDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpyZW50YV9wYmlfcHYgPC0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lIA0KICAjIHNlbGVjdChhbmlvLHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvLCByZW50YV9kaWZfcHJlY2lvc19icmVudCApICU+JQ0KICBzZWxlY3QoYW5pbyxyZW50YV9kaWZfcHJlY2lvc19jcnVkbyApICU+JQ0KICBsZWZ0X2pvaW4ocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgJT4lIHNlbGVjdChhbmlvLCByZW50YV9kaWZfcHJlY2lvc19nYXMpICkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGVuY2lvbmVzX3JlZ2FsaWFzICU+JSBzZWxlY3QoLXVuaWRhZCkpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX3RjcF9jcnVkbyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfdGNwX2dhcyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcykpICU+JSANCiAgIGxlZnRfam9pbihzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBzdWJzaWRpb3MgPSBzdWJzaWRpb3NfZWplcyksIGJ5ID0iYW5pbyIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyApICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUgI2xhcyB2YmxlcyBjYXJnYWRhcyBhbnRlcmlvcm1lbnRlIHNlIHBhc2FuIGEgTU0NCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSByZXBsYWNlX25hKHgsIDApKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogICMgbGVmdF9qb2luKHJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgJT4lIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3RvcykpICU+JSANCiAgIyBsZWZ0X2pvaW4ocmVudGFfaGlkcm9jYXJidXJpZmVyYV90b3RhbCAlPiUNCiAgIyAgICAgICAgICAgICBmaWx0ZXIoc3RvY2tfc2VsZWNjaW9uYWRvID09ICJwcHllX2JvbHNhciIpICU+JQ0KICAjICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhcyA9IHJlbnRhX2Nvbl91bmlvbl90ZykgJT4lIA0KICAjICAgICAgICAgICAgIG11dGF0ZShyZW50YV9lbXByZXNhcyA9IDApKSAlPiUNCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iKSAlPiUgDQogIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSAlPiUgcmVuYW1lKHVuaWRhZF9wYmlfZ2NpYSA9IHVuaWRhZCkpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2dhcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcyAvaXBjXzE4LA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAvIGlwY18xOCwNCiAgICAgICAgICMgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgPSByZW50YV9kaWZfcHJlY2lvc19icmVudCAvaXBjXzE4LA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gPSByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkby9pcGNfMTgsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgPSByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMvaXBjXzE4LA0KICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSByZWdhbGlhc190b3RhbCAvIGlwY18xOCwNCiAgICAgICAgIHJldGVuY2lvbmVzX2NydWRvX2prID0gcmV0ZW5jaW9uZXNfY3J1ZG9famsgLyBpcGNfMTgsIA0KICAgICAgICAgc3Vic2lkaW9zID0gc3Vic2lkaW9zL2lwY18xOCwNCiAgICAgICAgICMgcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MgPSByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3Rvcy9pcGNfMTgsDQogICAgICAgICByZW50YV90b3RhbCA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcysgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gKw0KICAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyArIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyArDQogICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsICsgIHJldGVuY2lvbmVzX2NydWRvX2prIC0gc3Vic2lkaW9zLA0KICAgICAgICAgcmVudGFfcHYgPSAocmVudGFfdG90YWwqaXBjXzE4KS9nYW5hbmNpYSwNCiAgICAgICAgIHJlbnRhX3BiaSA9IChyZW50YV90b3RhbCppcGNfMTgpL3BiaSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiwNCiAgICAgICAgIHJlbnRhX3VzZF90Y2MgPSAocmVudGFfdG90YWwqaXBjXzE4KSAvIHRjYywgDQogICAgICAgICByZW50YV91c2RfdGNwID0gKHJlbnRhX3RvdGFsKmlwY18xOCkgLyB0Y3AsKSAgJT4lIA0KICByZW5hbWUocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICAjIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfYnJlbnQgPSByZW50YV9kaWZfcHJlY2lvc19icmVudCwNCiAgICAgICAgIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gLA0KICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzID0gcmVudGFfc29icmV2YWx1YWNpb25fZ2FzKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGlwY18xOCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICAjIHNlbGVjdCgtcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8pDQogICMgc2VsZWN0KC1yZW50YV9kaWZfcHJlY2lvc19icmVudCkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCg0KDQojUmVudGEgdG90YWwNCmdyYWZfcmVudGFfdG90YWwgPC0gcmVudGFfcGJpX3B2ICU+JQ0KICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBzZWxlY3QoLWModW5pZGFkLCBpcGNfMTgsIHJlbnRhX3RvdGFsLCB0Y2MsIHRjcCwgc29icmV2YWx1YWNpb24pKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6OCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gInN0YWNrIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkN1cnNvcyBkZSBhcHJvcGlhY2nDs24uIE1pbGxvbmVzIHBlc29zIGRlIDIwMTgiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWwsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCiMgT0xWSURBUg0KIyBncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uX2IgPC0gcmVudGFfdXNkICU+JSANCiMgICBmaWx0ZXIoIShhdXRvciA9PSAiUHJvcGlhIiAmIHRpcG9fZGVfcmVudGEgPT0gInJlbnRhX3RvdGFsIikpICU+JQ0KIyAgIG11dGF0ZSh0aXBvX2RlX3JlbnRhPSBjYXNlX3doZW4odGlwb19kZV9yZW50YSA9PSJyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zIiAmDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9yID09ICJQcm9waWEiIH4gInJlbnRhX3RvdGFsIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB0aXBvX2RlX3JlbnRhKSkgJT4lDQojICAgZmlsdGVyKHRpcG9fZGVfcmVudGEgPT0gInJlbnRhX3RvdGFsIikgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gYXV0b3IpKSsNCiMgICBnZW9tX2xpbmUoKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsIA0KIyAgICAgICAgc3VidGl0bGUgPSAiQ29uIHJlbnRhIHRvdGFsIHByb3BpYSBtZXRvZG9sb2fDrWEgcHJvcGlhIiwgDQojICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KIyAgIHRoZW1lX2NsYXNzaWMoKSsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkNCiMgZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbl9iDQoNCg0KI1JlbnRhIFRDQw0KZ3JhZl9yZW50YV90b3RhbF91c2QgPC0gcmVudGFfcGJpX3B2ICU+JSANCiAgc2VsZWN0KGMoYW5pbywgcmVudGFfdXNkX3RjYywgcmVudGFfdXNkX3RjcCkpICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5NjIpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjozKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhKSApKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJNaWxsb25lcyBkZSBVU0QiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF91c2QsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KDQoNCiNjb21wYXJhY2lvbiBjb24gRlINCmdyYWZfY29tcGFyYWNpb25fcmVudGFzIDwtIHJlbnRhX3BiaV9wdiAlPiUgDQogIG11dGF0ZShmdWVudGUgPSAiUHJvcGlhIHZpYSBzdW1hIGRlIG1lY2FuaXNtb3MiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsZnVlbnRlLCAgcmVudGFfdG90YWwgKSAlPiUgDQogIGJpbmRfcm93cyhyZW50YV90b3RhbF9wYmlfcHYgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlciggZnVlbnRlX2djaWEgPT0gIlByb3BpYSIpICU+JQ0KICAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZSA9ICJQcm9waWEgdmlhIGRlc2N1ZW50b3Mgc29icmUgVkJQIikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sZnVlbnRlLCAgcmVudGFfdG90YWwgKSApICU+JSANCiAgYmluZF9yb3dzKHJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlID0gIkbDoXJmYXJvIFJ1aXogeSBCaWxsIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGZ1ZW50ZSwgIHJlbnRhX3RvdGFsKSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA+PSAxOTYyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCByZW50YV90b3RhbCwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjM1KSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdyYWZfY29tcGFyYWNpb25fcmVudGFzDQoNCg0KI3NvYnJlIHBiaSB5IHB2DQpncmFmX3JlbnRhX3RvdGFsX3B2IDwtIHJlbnRhX3BiaV9wdiAlPiUgDQogIHNlbGVjdChhbmlvLCByZW50YV9wdixyZW50YV9wYmkgKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6MykgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdW1hIGRlIG1lY2FuaXNtb3MiLA0KICAgICAgIHkgPSAiJSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudCkNCg0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX3B2LCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCg0KI3NvbG8gcmVudGEgZW1wcmVzYXMNCiMgcmVudGFfcGJpX3B2ICU+JQ0KIyAgIGZpbHRlcihhbmlvID4gMTk2MCkgJT4lIA0KIyAgIG11dGF0ZShyZW50YV9lbXByZXNhc19wdiA9IHJlbnRhX2VtcHJlc2FzKmlwY18xOC9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfZW1wcmVzYXNfcGJpID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3BiaSkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhc19wdiwgcmVudGFfZW1wcmVzYXNfcGJpKSAlPiUgDQojICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCAyOjMgKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgZmlsbCA9IHZhcmlhYmxlKSkrDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBhcHJvcGlhZGEgcG9yIGVtcHJlc2FzIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiMgICAgICAgIHkgPSAiJSIpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50KQ0KDQogIA0KYGBgDQoNCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyBzb2xvIGdhcw0KIyBHYXMNCiMgcmVudGFfZ2FzX3BiaV9wdiA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQojICAgc2VsZWN0KGFuaW8scmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMsIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzICkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8gKSAlPiUgDQojICAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUgDQojICAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpKSAlPiUgDQojICAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2dhc19wdiA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzX3BiaSA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9wYmksDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzX3B2ID0gcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvZ2FuYW5jaWEsDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzX3BiaSA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzL3BiaSwNCiMgICAgICAgICAgdW5pZGFkID0gIk1NX3Blc29zX2NvcnIiKQ0KIyANCiMgZ3JhZl9yZW50YV9nYXNfcHYgPC0gcmVudGFfZ2FzX3BiaV9wdiAlPiUgDQojICAgc2VsZWN0KGFuaW8sIDc6bmNvbCguKSApICU+JSANCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiUmVudGEgcGV0cm9sZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8geSBleHRlcm5vIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiMgICAgICAgIHkgPSAiJSIpDQojIHBsb3RseTo6Z2dwbG90bHkoZ3JhZl9yZW50YV9nYXNfcHYpDQpgYGANCg0KIyMgQ29zdG9zDQpgYGB7cn0NCg0KY29zdG9zIDwtIHByb2R1Y2Npb25fdG90YWwgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX3Byb2R1Y2Npb249dW5pZGFkLCBwcm9kdWNjaW9uX3RvdGFsPXByb2R1Y2Npb25fdG90YWxfYmVwKSAlPiUgDQogIGxlZnRfam9pbih2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygiY29uc3Vtb19pbnRlcm1lZGlvIiwgIm1hc2Ffc2FsYXJpYWwiLCJjb25zdW1vX2tfZmlqbyIgKSkgJT4lDQogICAgICAgICAgICAgIHNwcmVhZChrZXk9dmFyaWFibGUsIHZhbHVlPXZhbG9yKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfaGlkcm9jYXJidXJpZmVyYV90b3RhbCAlPiUgc2VsZWN0KGFuaW8sIHN0b2NrX3NlbGVjY2lvbmFkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHB5ZSwgdGdfbm9ybWFsPXVuaW9uX3RnLCByZW50YV90b3RhbCkpICU+JSANCiAgbXV0YXRlKGNvc3Rvc190b3RhbGVzID0gY29uc3Vtb19pbnRlcm1lZGlvICttYXNhX3NhbGFyaWFsICsgY29uc3Vtb19rX2Zpam8sDQogICAgICAgICBjb3N0b3NfdG90YWxlc19zdW1fZ2NpYV9ub3JtYWwgPSBjb3N0b3NfdG90YWxlcyArIChwcHllICogdGdfbm9ybWFsKSwNCiAgICAgICAgIHByZWNpb19jb3N0byA9IGNvc3Rvc190b3RhbGVzL3Byb2R1Y2Npb25fdG90YWwsDQogICAgICAgICBwcmVjaW9fcHJvZHVjY2lvbiA9Y29zdG9zX3RvdGFsZXNfc3VtX2djaWFfbm9ybWFsL3Byb2R1Y2Npb25fdG90YWwsDQogICAgICAgICBwcmVjaW9fdmVudGFfcG90ZW5jaWFsID0gKChwcHllICogdGdfbm9ybWFsKStyZW50YV90b3RhbCkvcHJvZHVjY2lvbl90b3RhbCkNCmNvc3Rvcw0KYGBgDQoNCiMgQ29tcGFyYWNpw7NuIGNvbiBlc3RpbWFjacOzbiBkZSBvdHJvcyBhdXRvcmVzDQoNCmBgYHtyfQ0KDQojcmVudGEgdXNkIHZzIGF1dG9yZXMNCnJlbnRhX3VzZCA8LSByZW50YV9wYmlfcHYgJT4lIA0KICBzZWxlY3QoYW5pbyx0Y2MsIGlwY18xOCwgcmV0ZW5jaW9uZXNfY3J1ZG9famssIHJlZ2FsaWFzX3RvdGFsLCBjb250YWlucygicmVudGEiKSkgJT4lIA0KICBzZWxlY3QoIC0oMTI6bmNvbCguKSkpICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTYyKSAlPiUNCiAgbXV0YXRlKCByZXRlbmNpb25lc19jcnVkb19qaz0gcmV0ZW5jaW9uZXNfY3J1ZG9famsqaXBjXzE4L3RjYywgICAgICAgDQogICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSByZWdhbGlhc190b3RhbCppcGNfMTgvdGNjLCANCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyppcGNfMTgvdGNjLA0KICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMqaXBjXzE4L3RjYywNCiAgICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbyA9IHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvKmlwY18xOC90Y2MsICANCiAgICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMgPSByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMqaXBjXzE4L3RjYyAgLA0KICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uID0gcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8rIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcywNCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zID0gDQogICAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcysgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbywNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3RjYywNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID0gcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MqaXBjXzE4L3RjYywNCiAgICAgICAgICByZW50YV90b3RhbCA9IChyZW50YV90b3RhbCppcGNfMTgpIC8gdGNjLA0KICAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgICAgYXV0b3IgPSAiUHJvcGlhIikgJT4lIA0KICByZW5hbWUocmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lc19jcnVkb19qaywNCiAgICAgICAgIHJlZ2FsaWFzID0gcmVnYWxpYXNfdG90YWwNCiAgICAgICAgICAjIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MsDQogICAgICAgICAjIHJlbnRhX3RvdGFsX2dhcyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLA0KICAgICAgICAgIyByZW50YV90b3RhbF9jcnVkbyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgYXV0b3IsIGV2ZXJ5dGhpbmcoLiksIA0KICAgICAgICAgLWMoaXBjXzE4LCB0Y2MsIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvLCByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMsDQogICAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogICAgYmluZF9yb3dzKHJlbnRhX2F1dG9yZXMpDQojIyMjIw0KDQoNCiNncmFmaWNvIGNvbXBhcmFjaW9uIGNvbiBvdHJvcyBhdXRvcmVzDQpncmFmX3RpcG9zX3JlbnRhIDwtIHJlbnRhX3VzZCAlPiUgDQogIGZpbHRlcighKHRpcG9fZGVfcmVudGElaW4lIGMoInJlbnRhX3RvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW50YV9lc3RhZG9fdG90YWwiKSkpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBhdXRvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludChzaXplID0gMC41KSsNCiAgZmFjZXRfd3JhcCh+dGlwb19kZV9yZW50YSwgc2NhbGVzID0gImZyZWVfeSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgVVNEIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KZ2dwbG90bHkoZ3JhZl90aXBvc19yZW50YSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkgIA0KDQoNCg0KZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbiA8LSByZW50YV91c2QgJT4lIA0KICAjIGZpbHRlcighKGF1dG9yID09ICJQcm9waWEiICYgdGlwb19kZV9yZW50YSA9PSAicmVudGFfdG90YWwiKSkgJT4lDQogICMgbXV0YXRlKHRpcG9fZGVfcmVudGE9IGNhc2Vfd2hlbih0aXBvX2RlX3JlbnRhID09InJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3MiICYNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3IgPT0gIlByb3BpYSIgfiAicmVudGFfdG90YWwiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHRpcG9fZGVfcmVudGEpKSAlPiUNCiAgZmlsdGVyKHRpcG9fZGVfcmVudGEgPT0gInJlbnRhX3RvdGFsIikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGF1dG9yKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbiByZW50YSB0b3RhbCBwcm9waWEgbWV0b2RvbG9nw61hIGF1dG9yZXMiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbg0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KIyBnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uX2IpDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIyBFeHBvcnRhY2nDs24gZGUgcmVzdWx0YWRvcw0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QocHJvZHVjY2lvbl9jcnVkbyA9IHByb2RfbWVyZ2VfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vX2NydWRvID0gcHJlY2lvX21pX2NydWRvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRhY2lvbl9jcnVkbyA9IGV4cG9fcV9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvc19leHRlcm5vX2NydWRvID0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNjaW9uX2dhcyA9IHByb2RfbWVyZ2VfZ2FzX01NQlRVLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW50ZXJub19nYXMgPXByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uX2dhcyA9IGV4cG9fcV9nYXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vX2dhcyA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzaWRpb3MgPXN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpcG9fY2FtYmlvID0gdGNwX2FudWFsX2IsDQogICAgICAgICAgICAgICAgICAgICAgICAgaXBjID0gaXBjX3Byb21lZGlvKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICAicmVzdWx0YWRvcy92YXJpYWJsZXMueGxzeCIpDQoNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHJlbnRhX3RvdGFsX3B2X3BiaSA9IHJlbnRhX3BiaV9wdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvcl9wcm9kdWNjaW9uID0gdmFsb3JfdG90YWxfcHJvZHVjY2lvbiAsDQogICAgICAgICAgICAgICAgICAgICAgICAgVkFfcHJvcGlvID0gdmJwX3ZhX2NpX3Byb3BpYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19kaWZfcHJlY2lvc19tcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBnYXNfZGlmX3ByZWNpb3NfbXMgPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19zb2JyZXZhbHVhY2lvbl9tcyA9IHJlbnRhX3RjcF9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBnYXNfc29icmV2YWx1YWNpb25fbXMgPSByZW50YV90Y3BfZ2FzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJlbnRhX2JhbGFuY2VzID0gcmVudGFfcHJvZHVjY2lvbl9iYWxhbmNlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAjIGNydWRvX3ByZWNpb19leHBvX2prID0gcmVudGFfcHJlY2lvX2V4cG9fY3J1ZG9famssDQogICAgICAgICAgICAgICAgICAgICAgICAgIyBnYXNfZGlmX3ByZWNpb3NfZXhwb19qayA9IHJlbnRhX3ByZWNpb19leHBvX2dhc19qaywNCiAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWFjaW9uX2prID0gcmVudGFfaGlkcm9jYXJidXJvc19qayksIA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvcmVudGFfaGlkcm9jYXJidXJvc190b3RhbC54bHN4IikNCg0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KHJlbnRhX3RvdGFsX3BiaV9wdiwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3JlbnRhX3RvdGFsX1B4US54bHN4IikNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChjb3N0b3MsDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9jb3N0b3MueGxzeCIpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHByb2R1Y2Npb24gPSBwcm9kX21lcmdlX2NydWRvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uZXMgPSBleHBvX3FfY3J1ZG8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGVuY2lhcyA9IGV4aXN0ZW5jaWFzX3BldHJvbGVvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vID0gcHJlY2lvX21pX2NydWRvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vID0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcCA9IHRjcF9hbnVhbF9iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3JlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8ueGxzeCIpDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QocHJvZHVjY2lvbiA9IHByb2RfbWVyZ2VfZ2FzX01NQlRVLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uZXMgPSBleHBvX3FfZ2FzX01NQlRVLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ludGVybm8gPSBwcmVjaW9fbWlfZ2FzX01NQlRVLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwID0gdGNwX2FudWFsX2IsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxvID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMueGxzeCIpDQojICMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCgiY29uIHBvem9zIHBlcmZvcmFkb3MgcG9yIGHDsW8iPSBzdG9ja19lc3RpbWFkbywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uIHN0b2NrIGRlIHBvem9zIiA9IGVqZXJjaWNpb19mZF9zdG9jaywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICJhIHBhcnRpciBZUEYgKGZsdWpvKSIgPSBlamVyY2ljaW9fZmRfeXBmKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2VzdGltYWNpb24gZGUgc3RvY2sgYSBwYXJ0aXIgZGUgcG96b3MueGxzeCIpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCJjb24gcG96b3MgcGVyZm9yYWRvcyBwb3IgYcOxbyI9IHN0b2NrX3lfcG96b3MpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvZXN0aW1hY2lvbiBkZSBzdG9jayBhIHBhcnRpciBkZSBwb3pvcy54bHN4IikNCg0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoImZsdWpvIj0gY29tcGFyYWNpb25fcG96b3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgImZsdWpvX3RvdGFsIj0gbGlzdGFkb19wb3pvcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAic3RvY2siID0gcG96b3NfaWFwZ19jZW50ZW5hcmlvKSwgDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9wb3pvcy54bHN4IikNCg0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoYWZpcCA9IHN0b2NrX2FmaXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZXNfYm9sc2FyID0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudG9fWVBGX1BldEJSID11bmlvbl9zZWdtZW50b3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgYm9sc2FyX3YyID0gc3RvY2tfYmFsYW5jZXNfcmFtYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiaW52ZXJzaW9uIHBvciBwb3pvIChJQVBHKSIgPSBpbnZlcnNpb25fcG96b3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZlcnNpb24gcG9yIHBvem8gKENhcCBJVikiPSBpbnZlcnNpb25fcG96b3NfY2FwaXYpLA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3Mvc3RvY2tfcGV0cm9sZW8ueGxzeCIpDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdCgiVEcgaW5kaWNlIGZsdWpvIHBvem9zIj0gdGFzYV9nYW5hbmNpYV9yYW1hX2ZsdWpvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAjICJURyBpbmRpY2UgZmx1am8gc3RvY2siID0gdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJyZW50YSBlbXByZXNhcyIgPSByZW50YV90ZyksIA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvdGFzYSBkZSBnYW5hbmNpYSB5IHJlbnRhIGhpZHJvY2FyYnVyw61mZXJhLnhsc3giKQ0KDQoNCnByaW50KCJNYXRlbywgZWwgY8OzZGlnbyB0ZXJtaW7DsyBkZSBjb3JyZXIiKQ0KDQpgYGANCg0KDQoNCiMgUGVuZGllbnRlcyANCg0KUmVjb3J0ZXMgdmllam9zIHF1ZSBubyBzZSBwcSBzZSByZWFsaXphcm9uDQoNCjwhLS0gIyMjIFJlbnRhIHBvciBleHBvcnRhY2lvbmVzIGEgdGlwbyBkZSBjYW1iaW8gc29icmV2YWx1YWRvIC0tPg0KPCEtLSAjIyMjIENydWRvIC0tPg0KPCEtLSBgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfSAtLT4NCjwhLS0gcmVudGFfdGNwX2NydWRvIDwtIGNvbWV4X2NydWRvX3Nlc2NvICU+JSAtLT4NCjwhLS0gICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwgLS0+DQo8IS0tICAgICAgICAgIHVuaWRhZCA9PSAidXNkIikgJT4lIC0tPg0KPCEtLSAgIHJlbmFtZShleHBvX2NydWRvX3VzZCA9IHZhbG9yKSAlPiUgLS0+DQo8IS0tICAgdW5ncm91cCgpICU+JSAtLT4NCjwhLS0gICBzZWxlY3QoLWModmFyaWFibGUsIHVuaWRhZCwgcHJvZHVjdG8pKSAlPiUgLS0+DQo8IS0tICAgbGVmdF9qb2luKHRjcF9hbnVhbCwgYnkgPSAiYW5pbyIpICU+JSAtLT4NCjwhLS0gICBtdXRhdGUocmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fcGVzb3MgPSBleHBvX2NydWRvX3VzZCpUQ1AgLSBleHBvX2NydWRvX3VzZCpUQ0MgKSAtLT4NCjwhLS0gcmVudGFfdGNwX2NydWRvIC0tPg0KPCEtLSBgYGAgLS0+DQoNCjwhLS0gIyMjIyBHYXMgLS0+DQo8IS0tIGBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9IC0tPg0KPCEtLSByZW50YV90Y3BfZ2FzIDwtIGNvbWV4X2dhcyAlPiUgLS0+DQo8IS0tICAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIsIC0tPg0KPCEtLSAgICAgICAgICB1bmlkYWQgPT0gInVzZCIpICU+JSAtLT4NCjwhLS0gICByZW5hbWUoZXhwb19nYXNfdXNkID0gdmFsb3IpICU+JSAtLT4NCjwhLS0gICB1bmdyb3VwKCkgJT4lIC0tPg0KPCEtLSAgIHNlbGVjdCgtYyh2YXJpYWJsZSwgdW5pZGFkLCBwcm9kdWN0bykpICU+JSAtLT4NCjwhLS0gICBsZWZ0X2pvaW4odGNwX2FudWFsLCBieSA9ICJhbmlvIikgJT4lIC0tPg0KPCEtLSAgIG11dGF0ZShyZW50YV9zb2JyZXZhbHVhY2lvbl9nYXNfcGVzb3MgPSBleHBvX2dhc191c2QqVENQIC0gZXhwb19nYXNfdXNkKlRDQyApIC0tPg0KPCEtLSByZW50YV90Y3BfZ2FzIC0tPg0KPCEtLSBgYGAgLS0+DQoNCg0KDQo8IS0tICMjIyBSZW50YSBwb3IgcmVnYWzDrWFzIC0tPg0KPCEtLSBgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfSAtLT4NCjwhLS0gcmVudGFfcmVnYWxpYXMgPC0gcmVnYWxpYXMgJT4lIC0tPg0KPCEtLSAgIGxlZnRfam9pbih0Y3BfYW51YWwsIGJ5ID0gImFuaW8iKSAlPiUgLS0+DQo8IS0tICAgbXV0YXRlKHJlZ2FsaWFzX3Blc29zID0gY2FzZV93aGVuKG1vbmVkYSA9PSAidXNkIiB+IHJlZ2FsaWFzX3RvdGFsICogVENDLCAtLT4NCjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHJlZ2FsaWFzX3RvdGFsKSwgLS0+DQo8IS0tICAgICAgICAgIG1vbmVkYSA9IGNhc2Vfd2hlbihtb25lZGEgPT0gInVzZCIgfiAiYXJzIiwgLS0+DQo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gbW9uZWRhKSkgJT4lIC0tPg0KPCEtLSAgIGdyb3VwX2J5KGFuaW8pICU+JSAtLT4NCjwhLS0gICBzdW1tYXJpc2UocmVnYWxpYXNfcGVzb3MgPSBzdW0ocmVnYWxpYXNfcGVzb3MpKSAtLT4NCjwhLS0gcmVudGFfcmVnYWxpYXMgLS0+DQo8IS0tIGBgYCAtLT4NCg0KPCEtLSAjIyBSZW50YSB0b3RhbCAtLT4NCjwhLS0gYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0gLS0+DQo8IS0tIHJlbnRhX2prIDwtIHJlYWRfZGVsaW0oInJlbnRhX2prLmNzdiIsICI7IiwgLS0+DQo8IS0tICAgICBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgLS0+DQo8IS0tICAgcmVuYW1lKGFuaW8gPSBYMSkgLS0+DQoNCjwhLS0gIyByZW50YV9oaWRyb2NhcmJ1cm9zIDwtIHJlbnRhX3JlZ2FsaWFzICU+JSAtLT4NCjwhLS0gIyAgIGxlZnRfam9pbihyZW50YV90Y3BfZ2FzICU+JSAtLT4NCjwhLS0gIyAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXNfcGVzb3MpKSAlPiUgLS0+DQo8IS0tICMgICBsZWZ0X2pvaW4ocmVudGFfdGNwX2NydWRvICU+JSAtLT4NCjwhLS0gIyAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb19wZXNvcykpICAlPiUgLS0+DQo8IS0tICMgICBsZWZ0X2pvaW4ocmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lIC0tPg0KPCEtLSAjICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvX3Blc29zKSkgJT4lIC0tPg0KPCEtLSAjICAgbGVmdF9qb2luKHJlbnRhX2RpZl9wcmVjaW9zX2dhcyAlPiUgLS0+DQo8IS0tICMgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmVudGFfZGlmX3ByZWNpb3NfZ2FzX3Blc29zKSkgICU+JSAtLT4NCjwhLS0gIyAgIG11dGF0ZShyZW50YV90b3RhbF9wZXNvcyA9IHN1bShyZWdhbGlhc19wZXNvcywgLS0+DQo8IS0tICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzX3Blc29zLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb19wZXNvcywgLS0+DQo8IS0tICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG9fcGVzb3MsIHJlbnRhX2RpZl9wcmVjaW9zX2dhc19wZXNvcywgLS0+DQo8IS0tICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSkgJT4lIC0tPg0KPCEtLSAjICAgbGVmdF9qb2luKHJlbnRhX2prKSAlPiUgLS0+DQo8IS0tICMgICBtdXRhdGUoZGlmZXJlbmNpYSA9IChyZW50YV90b3RhbF9wZXNvcy9yZW50YV9qaykgLSAxKSAtLT4NCjwhLS0gIyAtLT4NCg0KPCEtLSByZW50YV9oaWRyb2NhcmJ1cm9zIDwtIHJlbnRhX3JlZ2FsaWFzICU+JSAtLT4NCjwhLS0gICBsZWZ0X2pvaW4ocmVudGFfdGNwX2dhcykgJT4lIC0tPg0KPCEtLSAgIGxlZnRfam9pbihyZW50YV90Y3BfY3J1ZG8pICU+JSAtLT4NCjwhLS0gICBsZWZ0X2pvaW4ocmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8pICU+JSAtLT4NCjwhLS0gICBsZWZ0X2pvaW4ocmVudGFfZGlmX3ByZWNpb3NfZ2FzKSAgJT4lIC0tPg0KPCEtLSAgIG11dGF0ZShyZW50YV90b3RhbF9wZXNvcyA9IHN1bShyZWdhbGlhc19wZXNvcywgLS0+DQo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhc19wZXNvcywgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fcGVzb3MsIC0tPg0KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW50YV9kaWZfcHJlY2lvc19jcnVkb19wZXNvcywgcmVudGFfZGlmX3ByZWNpb3NfZ2FzX3Blc29zLCAtLT4NCjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSkgJT4lIC0tPg0KPCEtLSAgIGxlZnRfam9pbihyZW50YV9qaykgJT4lIC0tPg0KPCEtLSAgIG11dGF0ZShkaWZlcmVuY2lhID0gKHJlbnRhX3RvdGFsX3Blc29zL3JlbnRhX2prKSAtIDEpIC0tPg0KDQo8IS0tIHJlbnRhX2hpZHJvY2FyYnVyb3MgLS0+DQoNCjwhLS0gIyB3cml0ZS5jc3YocmVudGFfaGlkcm9jYXJidXJvcywgInJlbnRhX2hpZHJvY2FyYnVyb3MuY3N2IikgLS0+DQoNCg0KPCEtLSBgYGAgLS0+DQoNCg0KPCEtLSBgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfSAtLT4NCjwhLS0gZ3JhZl9yZW50YSA8LSByZW50YV9oaWRyb2NhcmJ1cm9zICU+JSAtLT4NCjwhLS0gICBnYXRoZXIoLiwgLS0+DQo8IS0tICAgICAgICAgIGtleSA9IHZhcmlhYmxlLCAtLT4NCjwhLS0gICAgICAgICAgdmFsdWUgPSB2YWxvciwgLS0+DQo8IS0tICAgICAgICAgIDI6bmNvbCguKSkgJT4lIC0tPg0KPCEtLSAgIGZpbHRlcighKHZhcmlhYmxlICVpbiUgYygicmVudGFfdG90YWxfcGVzb3MiLCAicmVudGFfamsiLCAiZGlmZXJlbmNpYSIpKSkgJT4lIC0tPg0KPCEtLSAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGZpbGwgPSB2YXJpYWJsZSkpKyAtLT4NCjwhLS0gICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIpIC0tPg0KPCEtLSBncmFmX3JlbnRhIC0tPg0KPCEtLSBgYGAgLS0+DQoNClJlY29ydGUgZGUgZXN0aW1hY2lvbiBkZSBrdGEgYSBwYXJ0aXIgZGUgcG96b3MNCjwhLS0gIyMjIyBLVEEuIENvbiBzdG9jayBkZSBwb3pvcyBlbiBleHRyYWNjacOzbiBlZmVjdGl2YSAtLT4NCjwhLS0gYGBge3IgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0gLS0+DQo8IS0tICNLVEEgLS0+DQo8IS0tIGt0YV9hbmlvX2Jhc2VfYm9sc2FyIDwtIChzdG9ja19yYW1hICU+JSAgLS0+DQo8IS0tICAgZmlsdGVyKHZhcmlhYmxlID09ICJLVEEiICYgc2VjdG9yID09ICJwcm9kdWNjaW9uIikgJT4lIC0tPg0KPCEtLSAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIEtUQSA9IHZhbG9yKSkkS1RBWzEwXSAtLT4NCg0KPCEtLSBrdGFfYW5pb19iYXNlX2FmaXAgPC0gKHN0b2NrX3JhbWEgJT4lICAtLT4NCjwhLS0gICBmaWx0ZXIodmFyaWFibGUgPT0gIktUQSIgJiBzZWN0b3IgPT0gImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikgJT4lIC0tPg0KPCEtLSAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIEtUQSA9IHZhbG9yKSkkS1RBWzZdIC0tPg0KDQo8IS0tIHBvem9zX3N0b2NrX2t0YSA8LSBzdG9ja19yYW1hICU+JSAgLS0+DQo8IS0tICAgZmlsdGVyKHZhcmlhYmxlID09ICJLVEEiICYgc2VjdG9yICVpbiUgYygicHJvZHVjY2lvbiIsICJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIpKSAlPiUgLS0+DQo8IS0tICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgS1RBID0gdmFsb3IsIGZ1ZW50ZSkgJT4lICAtLT4NCjwhLS0gICBmdWxsX2pvaW4ocG96b3NfaWFwZ19jZW50ZW5hcmlvICU+JSAgLS0+DQo8IS0tICAgICAgICAgICAgICAgbXV0YXRlKCBpbmRpY2VfcG96b3NfMDYgPSBnZW5lcmFyX2luZGljZShzZXJpZT0gdG90YWxlcyAsIC0tPg0KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLCAtLT4NCjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA2KSkgJT4lICAtLT4NCjwhLS0gICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgaW5kaWNlX3Bvem9zXzA2KSkgIC0tPg0KDQo8IS0tIGVqZXJjaWNpb19mZF9zdG9jayA8LSBwb3pvc19zdG9ja19rdGEgJT4lIC0tPg0KPCEtLSAgIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCwgZnVlbnRlKSAlPiUgLS0+DQo8IS0tICAgc3VtbWFyaXNlKGt0YV9lc3RpbWFkb19ib2xzYXIgPSBrdGFfYW5pb19iYXNlX2JvbHNhciAqIGluZGljZV9wb3pvc18wNiwgLS0+DQo8IS0tICAgICAgICAgICAgIGt0YV9lc3RpbWFkb19hZmlwID0ga3RhX2FuaW9fYmFzZV9hZmlwICogaW5kaWNlX3Bvem9zXzA2KSAgJT4lICAtLT4NCjwhLS0gICB1bmdyb3VwKCkgJT4lICAtLT4NCjwhLS0gICBzZWxlY3QoLWModW5pZGFkLCAgZnVlbnRlKSkgJT4lICAtLT4NCjwhLS0gICBnYXRoZXIoa2V5ID12YXJpYWJsZSwgLS0+DQo8IS0tICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLCAgLS0+DQo8IS0tICAgICAgICAgICAgICAgICAgICAgICAyOjMpICU+JSAgLS0+DQo8IS0tICAgYmluZF9yb3dzKCBzdG9ja19yYW1hICU+JSAgLS0+DQo8IS0tICAgICAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZSA9PSAiS1RBIiAmIC0tPg0KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0b3IgJWluJSBjKCJwcm9kdWNjaW9uIiwgImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikpICU+JSAtLT4NCjwhLS0gICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICB2YXJpYWJsZSA9IGZ1ZW50ZSwgdmFsb3IgKSkgJT4lICAtLT4NCjwhLS0gICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAtLT4NCjwhLS0gIyBlamVyY2ljaW9fZmRfc3RvY2sgLS0+DQoNCg0KPCEtLSBncmFmX2VqZXJjaWNpb19mZyA8LSBlamVyY2ljaW9fZmRfc3RvY2sgJT4lICAtLT4NCjwhLS0gICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvcj0gdmFyaWFibGUpKSsgLS0+DQo8IS0tICAgZ2VvbV9saW5lKCkrIC0tPg0KPCEtLSAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKSsgLS0+DQo8IS0tICAgbGFicyh0aXRsZSA9ICJLVEEgYSBwYXJ0aXIgZGUgYmFsYW5jZXMsIEFGSVAgeSBlc3RpbWFkbyBwb3IgaW5kaWNlIGRlIHN0b2NrIHBvem9zIChiYXNlIDIwMDYpIiwgLS0+DQo8IS0tICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsgLS0+DQo8IS0tICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpIC0tPg0KDQoNCjwhLS0gY29yKHg9IHBvem9zX3N0b2NrX2t0YSRLVEFbcG96b3Nfc3RvY2tfa3RhJGZ1ZW50ZSA9PSAiQUZJUCJdICwgIC0tPg0KPCEtLSAgICAgeT0gcG96b3Nfc3RvY2tfa3RhJGluZGljZV9wb3pvc18wNltwb3pvc19zdG9ja19rdGEkZnVlbnRlID09ICJBRklQIl0sIC0tPg0KPCEtLSAgICAgIG1ldGhvZCA9ICJwZWFyc29uIiwgdXNlID0gImNvbXBsZXRlLm9icyIpIC0tPg0KPCEtLSAjIDAuNTQ4ODU3NiAtLT4NCg0KPCEtLSBjb3IoeD0gcG96b3Nfc3RvY2tfa3RhJEtUQVtwb3pvc19zdG9ja19rdGEkZnVlbnRlID09ICJCb2xzYXIiXSAsICAtLT4NCjwhLS0gICAgIHk9IHBvem9zX3N0b2NrX2t0YSRpbmRpY2VfcG96b3NfMDZbcG96b3Nfc3RvY2tfa3RhJGZ1ZW50ZSA9PSAiQm9sc2FyIl0sIC0tPg0KPCEtLSAgICAgIG1ldGhvZCA9ICJwZWFyc29uIiwgdXNlID0gImNvbXBsZXRlLm9icyIpIC0tPg0KPCEtLSAjIDAuODg3NTA3NCAtLT4NCg0KPCEtLSAjc2luIGZpbHRyYXIgbGEgdmFyaWFibGUgZGUgZnVlbnRlIC0tPg0KPCEtLSAjIDAuNDE3OTk2NyBjb24gS1RBIC0tPg0KPCEtLSAjIDAuNDI0MTY2MyBjb24gcHB5ZSAtLT4NCg0KPCEtLSBncmFmX2VqZXJjaWNpb19mZyAtLT4NCjwhLS0gYGBgIC0tPg0KDQoNCjwhLS0gIyMjIyBLVEEuIENvbiBwb3pvcyB0ZXJtaW5hZG9zIHBvciBhw7FvIC0tPg0KPCEtLSBgYGB7ciBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfSAtLT4NCjwhLS0gI0tUQSAtLT4NCjwhLS0gcG96b3NfZmx1am9fa3RhIDwtIHN0b2NrX3JhbWEgJT4lICAtLT4NCjwhLS0gICBmaWx0ZXIodmFyaWFibGUgPT0gIktUQSIgJiBzZWN0b3IgJWluJSBjKCJwcm9kdWNjaW9uIiwgImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikpICU+JSAtLT4NCjwhLS0gICBzZWxlY3QoYW5pbywgdW5pZGFkLCBLVEEgPSB2YWxvciwgZnVlbnRlKSAlPiUgIC0tPg0KPCEtLSAgIGZ1bGxfam9pbihjb21wYXJhY2lvbl9wb3pvcyAlPiUgIC0tPg0KPCEtLSAgICAgICAgICAgICAgIG11dGF0ZSggaW5kaWNlX3Bvem9zXzA2ID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IHBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhICwgLS0+DQo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sIC0tPg0KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDYpKSAlPiUgIC0tPg0KPCEtLSAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBpbmRpY2VfcG96b3NfMDYpKSAgLS0+DQoNCjwhLS0gZWplcmNpY2lvX2ZkX2ZsdWpvIDwtcG96b3NfZmx1am9fa3RhICU+JSAtLT4NCjwhLS0gICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGZ1ZW50ZSkgJT4lIC0tPg0KPCEtLSAgIHN1bW1hcmlzZShrdGFfZXN0aW1hZG9fYm9sc2FyID0ga3RhX2FuaW9fYmFzZV9ib2xzYXIgKiBpbmRpY2VfcG96b3NfMDYsIC0tPg0KPCEtLSAgICAgICAgICAgICBrdGFfZXN0aW1hZG9fYWZpcCA9IGt0YV9hbmlvX2Jhc2VfYWZpcCAqIGluZGljZV9wb3pvc18wNikgICU+JSAgLS0+DQo8IS0tICAgdW5ncm91cCgpICU+JSAgLS0+DQo8IS0tICAgc2VsZWN0KC1jKHVuaWRhZCwgIGZ1ZW50ZSkpICU+JSAgLS0+DQo8IS0tICAgZ2F0aGVyKGtleSA9dmFyaWFibGUsIC0tPg0KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWxvciwgIC0tPg0KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgMjozKSAlPiUgIC0tPg0KPCEtLSAgIGJpbmRfcm93cyhzdG9ja19yYW1hICU+JSAgLS0+DQo8IS0tICAgICAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZSA9PSAiS1RBIiAmIC0tPg0KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0b3IgJWluJSBjKCJwcm9kdWNjaW9uIiwgImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikpICU+JSAtLT4NCjwhLS0gICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHZhcmlhYmxlID0gZnVlbnRlLCB2YWxvciApICU+JSAgLS0+DQo8IS0tICAgICAgICAgICAgICAgbXV0YXRlKHZhcmlhYmxlID0gY2FzZV93aGVuKHZhcmlhYmxlID09ICJBRklQIiB+ICJLVEFfQUZJUCIsIC0tPg0KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSA9PSJCb2xzYXIiIH4gIktUQV9Cb2xzYXIiLCAtLT4NCjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZhcmlhYmxlKSkpJT4lICAtLT4NCjwhLS0gICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAtLT4NCg0KDQo8IS0tIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCgiY29uIHBvem9zIHBlcmZvcmFkb3MgcG9yIGHDsW8iPSBlamVyY2ljaW9fZmRfZmx1am8sICAtLT4NCjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICJjb24gc3RvY2sgZGUgcG96b3MiID0gZWplcmNpY2lvX2ZkX3N0b2NrKSwgcGF0aCA9ICJyZXN1bHRhZG9zL2VzdGltYWNpb24gZGUgc3RvY2sgYSBwYXJ0aXIgZGUgcG96b3MueGxzeCIpIC0tPg0KDQo8IS0tICNTaW4gZmlsdGFyIGxhIHZhcmlhYmxlIGZ1ZW50ZSAtLT4NCjwhLS0gY29yKHg9IHBvem9zX2ZsdWpvX2t0YSRLVEEsIHk9cG96b3NfZmx1am9fa3RhJGluZGljZV9wb3pvc18wNiwgLS0+DQo8IS0tICAgICAgbWV0aG9kID0gInBlYXJzb24iLCB1c2UgPSAiY29tcGxldGUub2JzIikgLS0+DQo8IS0tICMgMC4zMDY2ODA3IGNvbiBLVEEgLS0+DQo8IS0tICMgMC4zNTIzMTg1IGNvbiBwcHllIC0tPg0KDQo8IS0tIGNvcih4PSBwb3pvc19mbHVqb19rdGEkS1RBW3Bvem9zX2ZsdWpvX2t0YSRmdWVudGUgPT0gIkFGSVAiXSAsICAtLT4NCjwhLS0gICAgIHk9IHBvem9zX2ZsdWpvX2t0YSRpbmRpY2VfcG96b3NfMDZbcG96b3NfZmx1am9fa3RhJGZ1ZW50ZSA9PSAiQUZJUCJdLCAtLT4NCjwhLS0gICAgICBtZXRob2QgPSAicGVhcnNvbiIsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKSAtLT4NCjwhLS0gIyAtMC4xNTE2OTAyIC0tPg0KDQo8IS0tIGNvcih4PSBwb3pvc19mbHVqb19rdGEkS1RBW3Bvem9zX2ZsdWpvX2t0YSRmdWVudGUgPT0gIkJvbHNhciJdICwgIC0tPg0KPCEtLSAgICAgeT0gcG96b3NfZmx1am9fa3RhJGluZGljZV9wb3pvc18wNltwb3pvc19mbHVqb19rdGEkZnVlbnRlID09ICJCb2xzYXIiXSwgLS0+DQo8IS0tICAgICAgbWV0aG9kID0gInBlYXJzb24iLCB1c2UgPSAiY29tcGxldGUub2JzIikgLS0+DQo8IS0tICMgMC41Njk3NjE1IC0tPg0KDQoNCjwhLS0gZ3JhZl9lamVyY2ljaW9fZmcgPC0gZWplcmNpY2lvX2ZkX2ZsdWpvICU+JSAgLS0+DQo8IS0tICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3I9IHZhcmlhYmxlKSkrIC0tPg0KPCEtLSAgIGdlb21fbGluZSgpKyAtLT4NCjwhLS0gICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrIC0tPg0KPCEtLSAgIGxhYnModGl0bGUgPSAiS1RBIGEgcGFydGlyIGRlIGJhbGFuY2VzLCBBRklQIHkgZXN0aW1hZG8gcG9yIGluZGljZSBkZSBmbHVqbyBwb3pvcyAoYmFzZSAyMDA2KSIsIC0tPg0KPCEtLSAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrIC0tPg0KPCEtLSAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSAtLT4NCjwhLS0gIyBnZ3Bsb3RseShncmFmX2VqZXJjaWNpb19mZykgLS0+DQo8IS0tIGdyYWZfZWplcmNpY2lvX2ZnIC0tPg0KPCEtLSBgYGAgLS0+DQoNCg0KDQoNCg0KDQojIyMgQ2FsY3Vsb3MgZGUgb3Ryb3MNCkJ1c2NhcjogDQotIE1vbnRhbWF0DQotIEVpbnN0b3NzIFRpbnRvIEEuIEFuw6FsaXNpcyBkZSBsYSBFdm9sdWNpw7NuIHJlY2llbnRlIGRlIGxhIFJlbnRhIFBldHJvbGVyYSBlbiBBcmdlbnRpbmEgQ0VDRQ0KDQojIyMgUHJvZHVjY2nDs24NCiAqIHZlciBjYW50aWRhZGVzIHZlbmRpZGFzIHkgbm8gcHJvZHVjaWRhcy4gYnVzY2FyIHNpIGV4aXN0ZSBzZXJpZSBkZSBleGlzdGVuY2lhcw0KIA0KIyMjIEV4cG9ydGFjaW9uDQogICMgZmlqYXJzZSBkZSBsbyBkZSBiZXRhbmlhDQogIA0KIyMjIFByZWNpb3MNCiAgI25vdGFzIHNvYnJlIGxhIHJldmlzacOzbiBkZSBleGNlbHMgYmV0YW5pYToNCiAgKiBEaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGNvbWJ1c3RpYmxlcyB5IGNydWRvIC0gQVJHIEVFVVUgV1RJOiBlbCBwcmVjaW8gaW50ZXJubyBlbiBwZXNvcyBwYXJlY2UgcmVzdWx0YW50ZSBkZSBsYSBkaXZpc2nDs24gZW50cmUgdmFsb3IgeSBjYW50aWRhZC4gTHVlZ28gZWwgcHJlY2lvIGludGVybm8gZW4gZG9sYXJlcyBlc3RhIGVuIGJhcnJpbGVzIHBlcm8gbm8gc2Ugc2FiZSBjb21vIHNlIGNhbGN1bG8gbmkgZnVlbnRlDQogICogU2VyaWUgbGFyZ2EgY3Vyc29zIGRlIHJlbnRhIDE5NjMtMjAxMTogZWwgcHJlY2lvIGludGVybm8gZGUgbGEgc29sYXBhIHJlY2FsY3VsbyBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zLCBubyBlcyBuaSBzZXNjbyBuaSBtZWNvbiBwZXJvIGRhIG11eSBzaW1pbGFyDQogIA0KICAjcHJlY2lvIGdhcyBib2xpdmlhOiBmdWVudGUgZGUgYm9saXZpYS4gdmVyIGVsIHRlbWEgZGUgdHJhbnNwb3J0ZQ0KICAjcHJlY2lvIGRlIHJlZmVyZW5jaWEgZGUgcGV0cm9sZW86IGVzY2FsYW50ZT8gb3Rybz8NCiAgDQogICMgU3Vic2lkaW9zOiBKSyB1c8OzIGZ1ZW50ZSBFSkVT